假设我有一个名为IMessage的基类,以及许多派生的消息类。
在我的程序中,我有一种接收所有消息的方法:
void ReceiveMessage(IMessage message)
{
}
我想为每种类型的消息调用特定的方法。 如果我能这样做会很棒:
void ReceiveMessage(IMessage message)
{
HandleMessage(message);
}
void HandleMessage(DummyMessage message)
{
Blah;
}
void HandleMessage(SillyMessage message)
{
Yuk;
}
..但显然“我们不会那样出去”。
那么如何从单个消息处理程序调用特定消息的具体处理程序呢?
答案 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
}