似乎我越是谈论这个问题,我就越了解它。我认为我之前的问题没有传达我想要正确做的事情。对此我深表歉意。
在我的设计中,我有 GameObjects,它本质上是一个聚合类,GameObject 中的所有功能都是通过向其添加各种“功能”来实现的。要素是要素类的子类,具有自己的成员和功能。所有功能都可以接收消息
class Feature
{
public:
virtual void takeMessage(Message& message) = 0;
};
class VisualFeature : public Feature
{
public:
void takeMessage(Message& message);
private:
RenderContext m_renderer;
};
... Additional Features ...
FeatureServers 是负责协调各种功能的对象。GameObjects 可以订阅 FeatureServers 以接收来自它们的消息,Features 可以订阅 GameObjects 来处理它感兴趣的消息。
因此,例如在这段代码中:
GameObject Square;
VisualFeature* SquareSprite = new VisualFeature();
Square.subscribe(SquareSprite, "MESSAGE_RENDER");
Square.addFeature(SquareSprite);
m_VisualFeatureServer.subscribe(Square, "MESSAGE_RENDER");
VisualFeatureServer 发送与“MESSAGE_RENDER”相关的消息,可能看起来像这样
class Message
{
public:
std::string getID() {return m_id;}
bool isConsumed() {return m_consumed;}
void consume() {m_consumed = true;}
protected:
bool isConsumed;
std::string m_id;
}
class Message_Render : public Message
{
public:
Message_Render() : m_id("MESSAGE_RENDER"), m_consumed(false) {}
RenderTarget& getRenderTarget() {return m_target;}
private:
RenderTarget& m_target;
};
当 VisualFeatureServer 将 Message_Render 类发送到 Square GameObject 时,它会将其转发到订阅以接收该特定消息的任何 FeatureComponents。在这种情况下,VisualFeature 类接收 Message_Render 消息。这是我的问题所在,VisualFeature 类将收到一条消息,它可以通过它的 ID 判断是 Message_Render,我希望能够将其视为 Message_Render 而不是像这样的消息:
void VisualFeature::takeMessage(Message& message)
{
//Here's the problem, I need a pattern to handle this elegantly
derivedMessage = convertMessageToDerivedType(message);
this->handleDerivedMessageType(derivedMessage);
}
void VisualFeature::handleDerivedMessageType(Message_Render& message)
{
message.getRenderTarget().render(m_renderer);
message.consume();
}
有没有办法优雅地处理这个设计的 takeMessage 部分?