如何在通用消息接收器中为不同的类类型调用不同的方法
本文关键字:类型 方法 调用 接收器 消息 | 更新日期: 2023-09-27 18:28:55
假设我有一个名为IMessage的基类,以及许多派生的消息类。
在我的程序中,我有一种接收所有消息的方法:
void ReceiveMessage(IMessage message)
{
}
我想为每种类型的消息调用一个特定的方法。如果我能做到那就太好了:
void ReceiveMessage(IMessage message)
{
HandleMessage(message);
}
void HandleMessage(DummyMessage message)
{
Blah;
}
void HandleMessage(SillyMessage message)
{
Yuk;
}
但显然"我们不会那样出去"。
那么,当从单个消息处理程序调用时,我该如何为特定消息实现特定的处理程序呢?
处理这种情况的经典方法是通过Visitor模式。
话虽如此,您实际上可以通过dynamic
在C#中更轻松地处理此问题,如下所示:
void ReceiveMessage(IMessage message)
{
dynamic specificMessage = message;
this.HandleMessage(specificMessage):
}
动态绑定引擎将在运行时为您的特定消息类型找到"最佳"匹配,并将调用路由到适当的方法。
IMessage接口应该定义一个HandleMessage()函数,每个类型都实现该函数:
public interface IMessage
{
void HandleMessage();
}
public class DummyMessage : IMessage
{
public void HandleMessage()
{
Blah;
}
}
public class SillyMessage : IMessage
{
public void HandleMessage()
{
Yak;
}
}
然后你会这样称呼它:
void ReceiveMessage(IMessage message)
{
message.HandleMessage();
}
尝试使用工厂方法。查找工厂设计模式。
你可以按照你的建议去做,尽管这不是很枯燥,我认为这里的其他建议更合适。尽管如此,出于完整性的考虑,这里有一种接近您最初想要的方法:
void ReceiveMessage( IMessage message ) {
if( message as DummyMessage != null ) HandleMessage( message as DummyMessage );
else if( message as SillyMessage != null ) HandleMessage( message as SillyMessage );
// etc
}