为了账号安全,请及时绑定邮箱和手机立即绑定

用C#双重调度?

用C#双重调度?

翻阅古今 2019-12-25 10:34:36
我听过/读过这个词,但不太理解它的意思。我什么时候应该使用这种技术,我将如何使用它?谁能提供一个好的代码示例?
查看完整描述

3 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

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


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


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


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


对于双重分派,将同时考虑对象的类型和方法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).

    }

}       


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 663 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信