C 中協變抗變之我見

2021-06-11 01:49:09 字數 1241 閱讀 1315

在.net4.0中,新加入了協變與抗變的內容,最近查了一下msdn,對它有了乙個大概的理解,希望能夠幫助到和我一樣的菜鳥。

協變:協變非常類似於普通的多型性的分配,它是針對成員的返回值型別,定義時使用關鍵字out,假定您有乙個名為 base 的基類和乙個名為 derived 的派生類:

ienumerabled = new list();

ienumerableb = d;

這就是乙個簡單的協變的應用,它主要是從派生類到基類的乙個轉化。

抗變(逆變):

抗變主要是在傳遞型別引數的時候使用的,定義時使用關鍵字in,這樣做有利於保證引數傳遞的安全性和效率。還是上邊的例子:

idisplaybd=new shapedisplay();

idisplaydd=bd;

這是乙個簡單的抗變的例子,它主要是從基類到派生類的轉換。

下邊是乙個協變抗變綜合在一塊的例子:

using system;

using system.collections;

using system.collections.generic;

namespace xiebian

public double height

public override string tostring()

, height:",width,height);

} }public class rectangle:shape

public inte***ce iindex

int count

} public class rectanglecollection:iindex,

new rectangle,

new rectangle

};public static rectanglecollection getrectangles()

public rectangle this[int index]

}public int count}}

public inte***ce idisplay

public class shapedisplay:idisplay width: ,height:",s.gettype().name,s.width,s.height);

} }class program }

}

結果:

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

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

C 中的協變與抗變

using system using system.collections.generic using system.linq using system.text namespace csharp基礎 else console.readline 按照委託簽名,但返回的是子類的例項 public st...

C 中的協變和抗變

net4通過協變和抗變為泛型介面和泛型委託新增了乙個重要擴充套件。協變和抗變指對引數和返回值的型別進行轉換。在.net中,引數型別是協變的。假定有 shape和 rectangle 類,rectangle 派生自shape基類。宣告display 方法是為了接受 shape型別的物件作為其引數 pu...