委託型別協變和逆變的實際意義

2021-06-05 10:25:28 字數 722 閱讀 1873

設乙個委託 typea1 delegatedefine(typeb1 b)和實際呼叫的委託方法

typea2 delegateinstance(typeb2 b)

根據物件導向繼承使用的原則,delegateinstance要賦給delegatedefine委託變數,供呼叫者呼叫,對於委託而言,相當於公共的規範,返回型別是typea,那麼你實際返回型別就必須是typea或者typea的子類,也就是說,對於委託返回型別而言,實際的委託方法的返回型別必須是其子類,即typea2必須是typea1的子類,這就是所謂的返回型別的協變.而對於委託引數b的typeb1型別而言,這其實是告訴實際委託方法,我給你的型別是typeb1,因為是你接收,所以你的實際方法的型別必須是typeb1本身或者typeb1的父類,也即typeb2必須是typeb1的父類,這就是所謂的委託引數型別的逆變(有的稱為抗變).大家知道,委託其實相當於一種介面,或者叫標準,作為標準當然是適用範圍越大越好.從上面的解析我們可以知道,要適用範圍越大越好,那麼定義委託的時候返回型別在類層次中應該越高越好,而引數型別應該越低越好。因為這樣可以使得更多的方法可以提供給委託呼叫。

從委託方角度來看,其實就是要求定義標準時,對外提供的內容型別應該是具體越好(委託定義中的in引數其實就是委託方給受託方的內容型別),這樣可以使得更多的受託方法可以參與,而本身接受的內容型別(返回型別和out引數)越抽象越好,因為本身接受的內容型別是受託方給委託方的,型別越抽象,受託方就有更大的參與餘地。

ps:記錄也是一種學習.

協變和逆變

協變和逆變都是術語,前者指能夠使用比原始指定的派生型別的派生程度更大的型別,後者指能夠使用比原始指定的派生型別的派生程度更小的型別。using system using system.collections.generic using system.text class derived base s...

協變和逆變

二 真正的協變和逆變 概念 1 以前的泛型系統 或者說沒有in out關鍵字時 是不能 變 的,無論是 逆 還是 順 協 2 當前僅支援介面和委託的逆變與協變 不支援類和方法。但陣列也有協變性。3 值型別不參與逆變與協變。協變 foo foo public class testoutwhere t ...

協變和逆變

假設有這樣乙個類 class person icloneable 但是由於我們知道是返回乙個person類的例項,所以返回型別 object 寫在這裡總會覺得很彆扭,我們希望寫成 class person icloneable 顯然,這是錯的 雖然這是錯的,但這就是返回型別的協變性,只是非泛型介面和...