C 委託中的協變與逆變

2021-07-12 00:16:12 字數 670 閱讀 3695

1、簽名:返回值型別和引數。

2、委託呼叫要求委託的簽名必須與呼叫的方法的簽名匹配,如果簽名不匹配,將無法通過編譯器的型別檢查。

3、協變:允許所呼叫方法的返回型別可以是委託的返回型別的派生型別,當委託方法的返回型別具有的派生程度比委託簽名更大時,就稱為協變委託方法。協變委託方法的優點是:使得建立可被類和派生類同時使用的委託方法成為可能。

4、逆變:允許將帶有派生引數的方法用作委託時,當委託方法簽名具有乙個或多個引數,並且這些引數的型別派生自方法引數時,就稱為逆變委託方法。逆變委託方法的優點是:使得可由大量類使用的更通用的委託方法的建立變的更加簡單。

例項:person類能夠派生student類,並且person類對應的返回第i個元素的方法為getperson(int i){};student類返回第i個元素的方法為getstudent(int i){};

如下定義委託:

public delegate person pointperson(int i);

由於委託pointperson的簽名與方法getperson的簽名匹配,則可以由該委託物件來呼叫getperson。因為getstudent的返回值型別是委託pointperson返回值型別的派生類,則方法getstudent就稱為協變方法。

在委託實現的過程中,系統會進行隱士的轉換,將getstudent的返回值型別轉換為person型別。

C 協變與逆變

用最簡單的最有內涵的方式進行概括 在oo哲學裡面 有個依賴倒置,這是個oo的核心 就是用父類物件可以代表後面也許動態增加的子類物件從而增加了軟體的,可擴充套件性,和相對穩定性,並且開啟了一種oo正規化 class a class a1 a class a2 a 用a a 這個物件可以表達a1,a2....

c 協變和抗變 C 中協變與抗變(逆變)

泛型在.net 2.0中正式的引入。在使用泛型的過程中,聯絡上物件導向的繼承性。往往很容易想當然敲出類似以下 list animallst new list 顯然這樣編譯是不通過的。雖然dog和animal之間有繼承性,但是list和list這兩個類之間並沒有繼承性。如果要解決這樣的問題,用上協變與...

MSDN 委託與介面,協變與逆變

委託和介面都允許類設計器分離型別宣告和實現。給定的介面可由任何類或結構繼承和實現 可以為任何類中的方法建立委託,前提是該方法符合委託的方法簽名。介面引用或委託可由不了解實現該介面或委託方法的類的物件使用。既然存在這些相似性,那麼類設計器何時應使用委託,何時又該使用介面呢?在以下情況中使用委託 當使用...