C# 共變性以及逆變性(Covariance v.s Contravariance)

Po-Ching Liu
2 min readOct 23, 2018

--

在C#中我們或多或少聽過Convariance 和 Contravariance,這兩個詞彙是對基底類別以及衍生類別的描述,詳細的code如下。

基底類別為Automotive,Car繼承Automotive,Suv又繼承Car,Truck繼承Automotive。

共變性 (Covariance )— 就是基底類別(父類別)可以取代衍生類別(子類別)

Automotive benz= new Car();

因為Car有繼承Automotive,因此new來的Car能當作Automotive使用,也就是基底類別可以取代衍生類別

Suv bmw = new Car();

因為Car是Suv的父類別,因此無法這樣使用,編譯時也會失敗

逆變性 (Contravariance) — 衍生類別可以取代基底類別

GetType(new Suv());

static void GetType(Car car){}

GetType的方法簽章為傳入Car類別,又因為Suv有繼承,因此在呼叫GetType時可以將子類別當作參數傳入呼叫,也就是衍生類別可以取代基底類別

基本上,Covariance 和 Contravariance,兩者只是"方向相反" :

.Covariance 用於回傳值(Ex.new instance、方法回傳),Contravariance用於傳入值(Ex.方法傳入)。

.Covariance 讓我們將衍生類別(子類別)指派給基底類別(父類別),Contravariance 則是將基底類別(父類別)指派給衍生類別(子類別)。

--

--