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 關注
- 780 瀏覽
添加回答
舉報