我正在尝试执行以下操作:
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");
}
}
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
{
}
}
当您事先不知道确切的类型并且您不想使用大的 switch 语句时非常有用。只是想知道这是否可以通过继承来实现,其中基类包含回退方法,而派生类包含所有更具体的方法。
最佳答案
它对您不起作用,因为即使 evt 是动态传递的,ProcessEvent 也不会声明为虚拟的。这意味着当编译对 ProcessEvent 的调用时,它会链接到在基类中找到的方法的唯一实现,并且永远不会执行派生类中的方法。此外,您不能简单地将 ProcessEvent 声明为虚拟的,因为派生类中的签名会有所不同。
为了让您的代码按预期工作,您可以在派生类中覆盖 ReceiveEvent,使其完全相同:
public override void ReceiveEvent(Event evt)
{
ProcessEvent(evt as dynamic);
}
如果要管理基类中未处理的事件,只需将基类中Process事件的修饰符改为protected即可(否则被覆盖版本的ReceiveEvents调用时无法执行)。
关于c# - C# 中派生类的动态调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10683210/