この問題について話すほど、理解が深まるようです。私の前の質問は、私が正しくやろうとしていることを伝えていなかったと思います。申し訳ありません。
私のデザインには、本質的に集約クラスであるGameObjectがあり、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 ...
FeatureServerは、さまざまな機能の調整を担当するオブジェクトです。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クラスをSquareGameObjectに送信すると、その特定のメッセージを受信するようにサブスクライブされている任意のFeatureComponentsに転送されます。この場合、VisualFeatureクラスはMessage_Renderメッセージを受信します。ここで私の問題があります。VisualFeatureクラスはMessage&を受信し、その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部分をエレガントに処理する方法はありますか?