用C#双重调度?
时间:2020-03-05 18:47:18 来源:igfitidea点击:
我听过/读过这个词,但不太理解它的意思。
我什么时候应该使用这种技术,我将如何使用它?谁能提供一个好的代码示例?
解决方案
回答
Double-dispatch是"访客"模式的另一个名称。
我有几年前写过的一篇文章,内容涉及使用反射实现访问者模式。 http://www.agileprogrammer.com/dotnetguy/articles/ReflectionVisitor.aspx
回答
访客模式是一种以面向对象的方式进行两次调度的方法。
当我们要在运行时而不是编译时根据其类型选择给定参数使用哪种方法时,它很有用。
双重调度是多重调度的特例。
当我们在对象上调用虚拟方法时,这被视为单调度,因为调用哪个实际方法取决于单个对象的类型。
对于双调度,将同时考虑对象的类型和方法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). } }