gpt4 book ai didi

c++ - 我如何管理一组派生但不相关的类

转载 作者:行者123 更新时间:2023-11-30 04:40:09 25 4
gpt4 key购买 nike

看来这个问题越讲越明白。我认为我之前的问题没有传达我正在尝试正确做的事情。对此我深表歉意。

在我的设计中,我有 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 以接收来自它们的消息,而 Features 可以订阅 GameObjects 来处理它感兴趣的消息。

例如在这段代码中:

GameObject Square;
VisualFeature* SquareSprite = new VisualFeature();
Square.subscribe(SquareSprite, "MESSAGE_RENDER");
Square.addFeature(SquareSprite);
m_VisualFeatureServer.subscribe(Square, "MESSAGE_RENDER");

VisualFeatureServer 发送绑定(bind)到“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 类将接收一个 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 部分?

最佳答案

另一个答案的编辑变得过于臃肿,所以我开始了一个新的。

您在 receiveMessage() 函数中进行的转换绝对是一种代码味道。

我认为您需要结合使用:

这个想法是每个组件类型只会订阅它自己类型的消息,因此只会接收为它准备的消息。这应该消除了类型转换的需要。

例如,通知对象可以使用由消息 ID 索引的通知对象 vector 。观察对象(派生组件类)可以订阅由其自己的消息 ID 索引的特定通知器。

您认为这种设计模式有帮助吗?

关于c++ - 我如何管理一组派生但不相关的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1719358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com