如何在通用消息接收方中为不同的类类型调用不同的方法?
假设我有一个名为IMessage的基类,以及大量的派生消息类。如何在通用消息接收方中为不同的类类型调用不同的方法?
在我的程序我有一种方法,它接收所有的消息:
void ReceiveMessage(IMessage message)
{
}
和我想调用用于每个类型的消息的特定的方法。 这将是巨大的,如果我能做到:
void ReceiveMessage(IMessage message)
{
HandleMessage(message);
}
void HandleMessage(DummyMessage message)
{
Blah;
}
void HandleMessage(SillyMessage message)
{
Yuk;
}
..但显然“我们是不会出这样的”。
那么我将如何去执行特定的消息处理程序,从一个消息处理程序调用?
经典的方式来处理这种类型的情况是通过Visitor pattern。
话虽这么说,你其实可以通过dynamic
处理这在C#中更容易一点,像这样:
void ReceiveMessage(IMessage message)
{
dynamic specificMessage = message;
this.HandleMessage(specificMessage):
}
动态绑定引擎会发现,在运行时,“最佳”匹配您的具体信息键入并将呼叫路由到适当的方法。
谢谢,幸运的是我的目标.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();
}
如果多个接收器需要对待不同的消息类型。在这种情况下,访问者模式是处理这种类型场景的经典方式。 – 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
}
不应该即时聊天界面定义“共同”的方法(S),其即时聊天的所有实现实现,这将允许你只需在你的ReceiveMessage方法中调用这些方法? – 2012-03-24 00:21:06
@TrevorPilley这取决于。有些时候这不合适。例如,许多游戏引擎或3D场景图形都会有场景中每个场景类型(消息)受到不同“演员”的非常不同的处理的情况。 – 2012-03-24 00:28:58
我想要在另一个类中调用处理程序,而不是在消息本身中...(例如,服务器类将包含所有处理程序的不同消息) – Pygmy 2012-03-24 00:30:27