c# - C# 中派生类的动态调度

标签 c# c#-4.0 dispatch

我正在尝试执行以下操作:

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/

相关文章:

c# - 如何非异步下载数据?

c# - 如何使用 C# 在 .Net 中的类型对象列表中选择对象属性的所有值

c# - 未将对象引用设置为行 if (!string.IsNullOrEmpty(tdcd.Text) && !string.IsNullOrEmpty(tdrcd.Text)) 处的对象实例

linq - C#MongoDB "Near"查询

c++ - 编译针对多个体系结构编译的 cpp 文件中 header 中定义的相同类

r - S4方法调度慢吗?

c# - 在没有继承的情况下向元素添加额外属性

c# - 在 Visual Studio 2010 中添加服务引用似乎不起作用

ios - 快速3中的dispatch_semaphore_t

c# - AutoMapper:调用Map()函数时忽略一些参数