C 泛型 協變和抗變

2021-10-05 23:20:58 字數 747 閱讀 2968

例如,可以給乙個需要 shape 引數的方法傳送 rectangle 引數嗎? 下面用示例說明這些擴充套件的優點。

在.net中,引數型別是協變的。 假定有 shape 和 rectangle 類, rectangle派生自 shape基類。 宣告 display() 方法是為了接受 shape 型別的物件作為其引數:

public void display(shape o){}
現在可以傳遞派生自 shape 基類的任意物件。 因為 rectangle 派生自 shape, 所以 rectangle 滿足 shape 的所有需求, 編譯器接受這個方法呼叫:

var r = new rectangle ;

display( r );

方法的返回型別是抗變的。 當方法返回乙個 shape 時, 不能把它賦予 rectangle, 因為 shape 不一定是 rectangle。 反過來是可行的。

例如有 getrectangle 函式:

public rectangle getrectangle();
就可以把結果賦予某個 shape:

shape s = getrectangle();

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

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

C 學習 6 泛型介面中的協變和抗變

1.變體的由來 眾所周知,多型性允許把派生類的物件放在基類的變數中,例如 cow mycow newcow 犛牛 animal myanimal mycow 之所以cow的型別放在aniaml型別的變數中可行,是因為cow派生自animal。但是,在介面中,這種情況是不適用的,會報錯。例如下面的 i...

C 泛型的協變和逆變

可變性是以一種型別安全的方式,將乙個物件當做另乙個物件來使用。如果不能將乙個型別替換為另乙個型別,那麼這個型別就稱之為 不變數。協變和逆變是兩個相互對立的概念 在c 4.0之前,所有的泛型型別都是不變數 即不支援將乙個泛型型別替換為另乙個泛型型別,即使它們之間擁有繼承關係,簡而言之,在c 4.0之前...