C 抗變和協變

2022-08-01 16:03:14 字數 1566 閱讀 7783

從.net3.5開始 加入了這兩個概念。在4.0中更是加強了

這裡就這兩個概念做乙個分析

委託呼叫的方法不需要與委託宣告定義的型別相同。因此可能出現協變和抗變。

1.返回型別協變

方法的返回型別可以派生於委託定義的型別。在下面的示例中,委託mydelegate定義為返回delegatereturn型別。賦予委託例項d1的方法返回delegatereturn2型別,delegatereturn2派生自delegatereturn,因此滿足了委託的需求。這稱為返回型別協變

public

class delegatereturn

public

class delegatereturn2 : delegatereturn

public

delegate delegatereturn mydelegate1();//定義的委託 返回值是父類

class program

static delegatereturn2 method1()//但是實際函式返回的是子類

}

可以看出 協變是指呼叫函式的返回型別是 委託的返回型別的子類

2. 引數型別抗變

術語"引數型別抗變"表示,委託定義的引數可能不同於委託呼叫的方法。這裡是返回型別不同,因為方法使用的引數型別可能派生自委託定義的型別。在下面的示例**中,委託使用的引數型別是delegateparam2,而賦予委託例項d2的方法使用的引數型別是delegateparam,

delegateparam是delegateparam2的基類。

public

class delegateparam

public

class delegateparam2 : delegateparam

public

delegate

void mydelegate2(delegateparam2 p);//引數是子類

class program

static

void method2(delegateparam p)//實際引數是父類

}

抗變就是指實際函式的引數用的是子類,但是委託是父類的引數

總結一句好記的話「參抗用小的,返協用大的」----->實際引數  抗變 用子類(輩分小)呼叫(委託),實際返回值  協變 用父類(大輩分)。。。。

delegate object  aaa(string s);//委託的 返回父類,引數子類

string method(object o);//函式 返回子類,引數父類

aaa a=new aaa(method);//委託方法正確

但是在.net3.5中的抗變協變 都只能對於陣列和介面使用,不能用於泛介面。但是在.net4.0中是可以的。。。

推薦帖子:

《C 高階程式設計》學習筆記 抗變和協變

1.協變和抗變 在.net 4之前,泛型介面是不變的。net 4通過協變和抗變為泛型介面和泛型委託新增了乙個重要的擴充套件。協變和抗變指對引數和返回值的型別進行轉換。例如,可以給乙個需要shape引數的方法傳送rectangle引數碼?下面用示例說明這些擴充套件的優點。在.net中,引數型別是協變的...

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

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

C 中協變抗變之我見

在.net4.0中,新加入了協變與抗變的內容,最近查了一下msdn,對它有了乙個大概的理解,希望能夠幫助到和我一樣的菜鳥。協變 協變非常類似於普通的多型性的分配,它是針對成員的返回值型別,定義時使用關鍵字out,假定您有乙個名為 base 的基類和乙個名為 derived 的派生類 ienumera...