3 回答
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).
}
}
- 3 回答
- 0 关注
- 733 浏览
添加回答
举报