基类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
?什么样的设计模式可以清晰地让每个处理程序处理其支持的消息对象?