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

时间:2012-03-24 00:15:58

标签: c# class methods handler derived

假设我有一个名为IMessage的基类,以及许多派生的消息类。

在我的程序中,我有一种接收所有消息的方法:

void ReceiveMessage(IMessage message)
{
}

我想为每种类型的消息调用特定的方法。 如果我能这样做会很棒:

void ReceiveMessage(IMessage message)
{
    HandleMessage(message);
}

void HandleMessage(DummyMessage message)
{
    Blah;
}

void HandleMessage(SillyMessage message)
{
    Yuk;
}

..但显然“我们不会那样出去”。

那么如何从单个消息处理程序调用特定消息的具体处理程序呢?

4 个答案:

答案 0 :(得分:4)

处理此类情况的经典方法是通过Visitor pattern

话虽如此,你可以通过dynamic在C#中更容易处理这个问题,如下所示:

void ReceiveMessage(IMessage message)
{
    dynamic specificMessage = message;
    this.HandleMessage(specificMessage):
}

动态绑定引擎将在运行时找到特定消息类型的“最佳”匹配,并将调用路由到适当的方法。

答案 1 :(得分:1)

您的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();
}

答案 2 :(得分:0)

尝试使用工厂方法。查看工厂设计模式。

答案 3 :(得分:0)

虽然它不是很干,但可以做你所建议的事情,我认为这里的其他建议更合适。尽管如此,为了完整性,这里有一种接近你原本想要的方法:

void ReceiveMessage( IMessage message ) {
  if( message as DummyMessage != null ) HandleMessage( message as DummyMessage );
  else if( message as SillyMessage != null ) HandleMessage( message as SillyMessage );
  // etc
}