Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在通用消息接收器中为不同的类类型调用不同的方法?_C#_Class_Methods_Handler_Derived - Fatal编程技术网

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

C# 如何在通用消息接收器中为不同的类类型调用不同的方法?,c#,class,methods,handler,derived,C#,Class,Methods,Handler,Derived,假设我有一个名为IMessage的基类和许多派生消息类 在我的程序中,有一种方法可以接收所有消息: void ReceiveMessage(IMessage message) { } 我想为每种类型的消息调用一个特定的方法。 如果我能做到,那就太好了: void ReceiveMessage(IMessage message) { HandleMessage(message); } void HandleMessage(DummyMessage message) { Blah

假设我有一个名为IMessage的基类和许多派生消息类

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

void ReceiveMessage(IMessage message)
{
}
我想为每种类型的消息调用一个特定的方法。 如果我能做到,那就太好了:

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

void HandleMessage(DummyMessage message)
{
    Blah;
}

void HandleMessage(SillyMessage message)
{
    Yuk;
}
…但显然“我们不能那样出去”


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

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

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

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

也就是说,在C中,通过
dynamic
,您实际上可以更轻松地处理这个问题,如下所示:

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

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

你的建议是可以做到的,尽管不是很干,我认为这里的其他建议更合适。尽管如此,出于完整性的考虑,这里有一种接近您最初寻找的方法:

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

IMessage接口不应该定义所有IMessage实现实现的“通用”方法吗?这将允许您在ReceiveMessage方法中调用这些方法?@TrevorPilley,这取决于具体情况。有时候这是不合适的。例如,许多游戏引擎或3D场景图都会出现这样的情况,即场景中的不同“参与者”对每种场景类型(消息)的处理非常不同。我希望处理程序在另一个类中调用,而不是在消息本身中调用。。。(例如,一个服务器类应该包含不同消息的所有处理程序)如果多个接收者需要以不同的方式对待单个消息类型,则这不起作用。在这种情况下,访问者模式是处理此类场景的经典方法。谢谢,幸运的是,我的目标是.NET4.0,所以动态节省了时间\o/