亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用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 關注
  • 780 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號