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

问题描述:

假设我有一个名为IMessage的基类,以及大量的派生消息类。如何在通用消息接收方中为不同的类类型调用不同的方法?

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

void ReceiveMessage(IMessage message) 
{ 
} 

和我想调用用于每个类型的消息的特定的方法。 这将是巨大的,如果我能做到:

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

void HandleMessage(DummyMessage message) 
{ 
    Blah; 
} 

void HandleMessage(SillyMessage message) 
{ 
    Yuk; 
} 

..但显然“我们是不会出这样的”。

那么我将如何去执行特定的消息处理程序,从一个消息处理程序调用?

+1

不应该即时聊天界面定义“共同”的方法(S),其即时聊天的所有实现实现,这将允许你只需在你的ReceiveMessage方法中调用这些方法? – 2012-03-24 00:21:06

+0

@TrevorPilley这取决于。有些时候这不合适。例如,许多游戏引擎或3D场景图形都会有场景中每个场景类型(消息)受到不同“演员”的非常不同的处理的情况。 – 2012-03-24 00:28:58

+0

我想要在另一个类中调用处理程序,而不是在消息本身中...(例如,服务器类将包含所有处理程序的不同消息) – Pygmy 2012-03-24 00:30:27

经典的方式来处理这种类型的情况是通过Visitor pattern

话虽这么说,你其实可以通过dynamic处理这在C#中更容易一点,像这样:

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

动态绑定引擎会发现,在运行时,“最佳”匹配您的具体信息键入并将呼叫路由到适当的方法。

+0

谢谢,幸运的是我的目标.net 4.0如此动态节省了一天! \ o / – Pygmy 2012-03-24 00:33:52

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

您即时聊天界面应该有一个的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(); 
} 
+0

如果多个接收器需要对待不同的消息类型。在这种情况下,访问者模式是处理这种类型场景的经典方式。 – 2012-03-24 00:26:20

虽然它不是很干,但我认为这里的其他建议更合适,可以做你的建议。不过,在完整的利益,这里是接近的方法是什么您最初寻找:

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