Har*_*can 8 c# dispatch c#-4.0
我正在尝试执行以下操作:
public abstract BaseClass {
public virtual void ReceiveEvent(Event evt)
{
ProcessEvent(evt as dynamic);
}
private void ProcessEvent(object evt)
{
LogManager.Log(@"Received an event that is not being processed!
Dispatch fallback");
}
}
public DerivedClass: BaseClass {
private void ProcessEvent(SpecificEvent evt)
{
LogManager.Log("Processing Event");
}
}
Run Code Online (Sandbox Code Playgroud)
SpecificEvents命中了回退方法而不是派生类中的方法.我一直在同一个类中使用动态调度,并发现它非常有用/干净.它是否不适用于上面示例中所示的派生类?
编辑: 答案似乎有些混乱.基本上我一直使用以下设计:
public class SomeClass{
public void DoSomethingDispatcher(SomeObject obj)
{
ProcessObject(obj as dynamic);
}
private void DoSomething(SomeObjectType1 obj)
{
}
private void DoSomething(SomeObjectType2 obj)
{
}
private void DoSomething(SomeObjectType3 obj)
{
}
private void DoSomething(object obj) //fallback
{
}
}
Run Code Online (Sandbox Code Playgroud)
当你事先不知道确切的类型并且你不想使用大的switch语句时,它非常适用.只是想知道这是否可以通过继承实现,其中基类包含回退方法,派生类包含所有更具体的方法.
它不适合你,因为即使evt是动态传递的,ProcessEvent也不会被声明为虚拟.这意味着当编译对ProcessEvent的调用时,它将链接到基类中找到的方法的唯一实现,并且永远不会执行派生类中的实现.此外,您不能简单地将ProcessEvent声明为虚拟,因为签名在派生类中会有所不同.
为了使代码按预期工作,您可以在派生类中重写ReceiveEvent,使其完全相同:
public override void ReceiveEvent(Event evt)
{
ProcessEvent(evt as dynamic);
}
Run Code Online (Sandbox Code Playgroud)
如果要管理基类中未处理的事件,只需将基类中的Process事件的修饰符更改为protected(否则在被重写的ReceiveEvents版本调用时不能执行).