如何在通用消息接收器中为不同的类类型调用不同的方法

本文关键字:类型 方法 调用 接收器 消息 | 更新日期: 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
}