看来我越谈论这个问题越好,我理解它。我认为我之前的问题没有传达我想要做的事。我对此表示歉意。我如何管理一组派生的,但不相关的类
在我的设计中,我有GameObjects,它本质上是一个聚合类,GameObject中的所有功能都是通过向它添加各种“功能”来实现的。 Feature是Feature类的子类,它具有自己的成员和函数。所有功能都可以接收消息
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从他们那里收到消息,并且功能可以订阅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类的游戏对象坊它,然后将其转发给订阅任何FeatureComponents接收该特定消息。在这种情况下,VisualFeature类接收Message_Render消息。这里是我的问题所在,VisualFeature类将收到Message &,它可以通过它的ID识别Message_Render,我希望能够将其视为Message_Render而不是Message,如下所示:
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部分?
我认为它离我所想的更近,我能想到的唯一问题是VisualComponents可以接收各种消息。例如,移动消息(当玩家移动时发送的东西)会对很多组件感兴趣,可视化用于更新精灵位置,用于改变声音的3D位置的声音以及这些类型的东西。我同意铸造是一种代码味道。 – 2009-11-12 04:58:08
更新了我的问题,我不认为我传达了我正在尝试做的正确事情。 – 2009-11-12 05:52:49