基本クラスMessageHandler
には派生クラスがあります。彼らはお互いにメッセージを伝えたいと思っています。メッセージは異なるクラスのものである可能性がありますが、基本クラスを共有するように作成することができます。MessageHandler
受信したメッセージのダウンキャストを回避するにはどうすればよいですか?receiveMessage
MessageHandlerの仮想関数をテンプレートパラメータ化する効果がある何かを行うことはどういうわけか可能ですか?
基本的に、私は次のコードをダウンキャストしないものに置き換えようとしています。できればコンパイル時のものです。
// ...
virtual void MessageHandler::receiveMessage(Message &msg) = 0;
// ...
// to receive a message
void DerivedMessageHandler::receiveMessage(Message& msg)
{
switch (msg.MsgType()) // enum
{
case Message::MessageType::A:
MessageA& = dynamic_cast<MessageA&>(msg);
break;
case Message::MessageType::B:
MessageB& = dynamic_cast<MessageB&>(msg);
break;
default:
// don't process unknown messages
break;
}
}
// to send a message
list<MessageHandler> mhList;
// populate list
for (MessageHandler& mh : mhList)
{
mh.receiveMessage(msg);
}
私はこれができないことを知っていますが、
template <typename M>
void MessageHandler::receiveMessage(M& msg) {}
そして、それぞれがDerivedMessageHandler
専門にしていM
ますか?各ハンドラーがサポートされているメッセージオブジェクトをきれいに処理できるようにするデザインパターンは何でしょうか。