一尘不染

用C#双重调度?

c#

我听过/读过这个词,但不太理解它的意思。

我什么时候应该使用这种技术,我将如何使用它?谁能提供一个好的代码示例?


阅读 297

收藏
2020-05-19

共1个答案

一尘不染

访客模式是一种以面向对象的方式进行两次调度的方法。

当您要在运行时而不是编译时根据类型选择给定参数使用哪种方法时,此功能很有用。

双重调度是 多重调度 的特例。

当您在对象上调用虚拟方法时,这被视为单调度,因为调用哪个实际方法取决于单个对象的类型。

对于双重分派,将同时考虑对象的类型和方法sole参数的类型。这类似于方法重载解析,只是参数类型是在运行时以双调度方式而不是在编译时静态确定的。

在多调度中,一个方法可以有多个参数传递给它,根据每个参数的类型使用哪种实现。评估类型的顺序取决于语言。在LISP中,它从头到尾检查每种类型。

具有多个分派的语言使用泛型函数,这些泛型函数只是函数代用,与使用类型参数的泛型方法不同。

要在C#中进行两次调度 ,可以声明一个带有唯一对象参数的方法,然后声明具有特定类型的特定方法:

using System.Linq;

class DoubleDispatch
{ 
    public T Foo<T>(object arg)
    { 
        var method = from m in GetType().GetMethods()
                   where    m.Name == "Foo" 
                         && m.GetParameters().Length==1
                         && arg.GetType().IsAssignableFrom
                                           (m.GetParameters()[0].GetType())
                         && m.ReturnType == typeof(T)
                   select m;

        return (T) method.Single().Invoke(this,new object[]{arg});          
    }

    public int Foo(int arg) { /* ... */ }

    static void Test() 
    { 
        object x = 5;
        Foo<int>(x); //should call Foo(int) via Foo<T>(object).
    }
}
2020-05-19