3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
訪客模式是一種以面向?qū)ο蟮姆绞竭M(jìn)行兩次調(diào)度的方法。
當(dāng)您要在運(yùn)行時(shí)而不是編譯時(shí)根據(jù)類(lèi)型選擇給定參數(shù)使用哪種方法時(shí),此功能很有用。
雙重調(diào)度是多重調(diào)度的特例。
當(dāng)您在對(duì)象上調(diào)用虛擬方法時(shí),這被視為單調(diào)度,因?yàn)檎{(diào)用哪個(gè)實(shí)際方法取決于單個(gè)對(duì)象的類(lèi)型。
對(duì)于雙重分派,將同時(shí)考慮對(duì)象的類(lèi)型和方法sole參數(shù)的類(lèi)型。這類(lèi)似于方法重載解析,只是參數(shù)類(lèi)型是在運(yùn)行時(shí)以雙調(diào)度方式而不是在編譯時(shí)靜態(tài)確定的。
在多調(diào)度中,一個(gè)方法可以有多個(gè)參數(shù)傳遞給它,根據(jù)每個(gè)參數(shù)的類(lèi)型使用哪種實(shí)現(xiàn)。評(píng)估類(lèi)型的順序取決于語(yǔ)言。在LISP中,它從頭到尾檢查每種類(lèi)型。
具有多個(gè)分派的語(yǔ)言使用泛型函數(shù),這些泛型函數(shù)只是函數(shù)代用,與使用類(lèi)型參數(shù)的泛型方法不同。
要在C#中進(jìn)行兩次調(diào)度,可以聲明一個(gè)帶有唯一對(duì)象參數(shù)的方法,然后聲明具有特定類(lèi)型的特定方法:
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 關(guān)注
- 777 瀏覽
添加回答
舉報(bào)