3

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

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

void ReceiveMessage(IMessage message)
{
}

我想为每种类型的消息调用一个特定的方法。如果我能做到,那就太好了:

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

void HandleMessage(DummyMessage message)
{
    Blah;
}

void HandleMessage(SillyMessage message)
{
    Yuk;
}

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

那么我将如何为特定消息实现特定处理程序,从单个消息处理程序调用?

4

4 回答 4

4

处理这种情况的经典方法是通过访问者模式

话虽如此,您实际上可以在 C# via 中更轻松地处理这个问题dynamic,如下所示:

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

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

于 2012-03-24T00:23:55.723 回答
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();
}
于 2012-03-24T00:21:59.433 回答
0

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

于 2012-03-24T00:18:15.760 回答
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
}
于 2012-03-24T00:52:31.463 回答