c# - C# 中的双重分派(dispatch)?

标签 c# design-patterns language-features double-dispatch

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

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

最佳答案

访问者模式是一种以面向对象的方式进行双重调度的方式。

当您想根据运行时的类型而不是编译时的类型为给定参数选择使用哪种方法时,它很有用。

双重 dispatch 是多重 dispatch 的特例。

当您在一个对象上调用一个虚拟方法时,这被认为是单分派(dispatch),因为调用哪个实际方法取决于单个对象的类型。

对于双重分派(dispatch),对象的类型和方法唯一参数的类型都会被考虑在内。这类似于方法重载决策,不同之处在于参数类型是在运行时在双分派(dispatch)中确定的,而不是在编译时静态确定的。

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

具有多重分派(dispatch)的语言使用泛型函数,它们只是函数声明,不像泛型方法那样使用类型参数。

要在 C# 中进行双重分派(dispatch),您可以声明一个具有唯一对象参数的方法,然后声明具有特定类型的特定方法:

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).
    }
}       

关于c# - C# 中的双重分派(dispatch)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42587/

相关文章:

c# - 如何从 HTML 提交按钮调用 ASP.NET CORE WEB API 3.1

java - Android/Java 及多个 "view states"

vb.net - 使用 SQL 参数处理 IN 子句中的数据?

c# - 如何将 ID 添加到 Html.ActionLink - 与在 HTML/CSS 中一样

c# - 使用 Mono/MonoDevelop 的 list 文件,以便在管理员中运行 C# 应用程序

oop - 带有 CRUD 方法的 DAO 类 VS。具有实体特定方法的 DAO 类

Java 颠倒文本 - 错误还是功能?

c# - C#有没有类似JavaScript的||的操作二传手?

c# - .net 核心 : Invalid property identifier character: {. 路径 'Logging',第 10 行,位置 2。Newtonsoft.Json.JsonTextReader.ParseProperty()

java - 正则表达式中的匹配行边界 (Pattern.MULTILINE/(?m)) 在 Java 中被破坏?