認真CS丨協變 逆變 不變

2021-08-19 18:16:00 字數 2159 閱讀 4153

賦值相容性:你可以將派生類物件的例項賦值給基類的變數,這叫做賦值相容性

class animal 

class dog : animal

class program

}

out關鍵字指明型別引數是協變的

1、我們不將dog賦值給animal(dog是factory類了,無法賦值給同級別的factory類),而是直接將它的引用makedog賦值給animal,這是可行的

2、我們還有一種方法,那就是協變(在型別引數前加out)(派生類只是用來輸出值)

「協變」是指能夠使用與原始指定的派生型別相比,派生程度更大的型別。 

「協變」->」和諧的變」->」很自然的變化」->string->object :協變

協變在委託宣告中加入out關鍵字,表示派生類只是用來輸出值,避免出現由delegate派生類是平級,它們定義的變數無法相互賦值產生的問題

using system;

namespace 可變性

class dog:animal

delegate t factory();

class program

static void main()}}

in關鍵字指明型別引數是逆變的

逆變:在型別引數前加in

基類物件的引用期望的是傳入到基類物件,但實際上(也允許它)傳入到派生物件,這叫做逆變

這樣可以工作,因為在呼叫的時候,呼叫**傳入了派生型別的變數,方法期望的只是其基類,方法完全可以像以前那樣操作物件的基類部分

「逆變」則是指能夠使用派生程度更小的型別。 

「逆變」->」逆常的變」->」不正常的變化」->object->string 逆變。 

using system;

class animal

class dog : animal

class program

static void main()

}

協變(out)是將派生類物件的引用傳入到基類物件,輸出派生類的值

逆變(in)是將基類物件的引用傳入到派生物件,派生物件只能操作基類部分

using system;

class father

class son : father

inte***ce imyifc

class example: imyifc //它是介面實現類

class program

static void main()

}

using system;

class father

class son : father

inte***ce imyifc

class example: imyifc //它是介面實現類

class program

static void main()

}

編譯器自動識別某個已構建的委託是協變或是逆變並且自動進行強制轉換

using system;

class father

class son : father

class program

static void main()

}

a、變化處理的是使用派生類替換基類的安全情況,反之亦然。因此變化只是用於引用型別,不能從值型別派生其他型別

b、顯式變化使用in和out關鍵字只適用於委託和介面,不適用於類、結構和方法

c、不包括in、out關鍵字的委託和介面型別引數叫不變。這些型別引數不能用於協變或逆變

delegate t factory< out r,  in s,  t >();

// 協變 逆變 不變

Scala型變 不變 協變及逆變

scala在高階型別的使用中,有三種變化,分別是順變 協變及逆變,下面詳細講講它們的含義與應用。高階型別是接受其他引數用來構造新型別的,所以又稱為 型別構造器 用type關鍵字來定義 定義高階型別 type foo t function0 t 宣告高階型別變數 val foo foo int 1 輸...

協變和逆變

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

C 協變逆變

1.泛型的協變逆變 注意 只能放在介面或者委託的泛型引數前面 1 委託泛型引數 static class testconsole private static argumentexception test1 object obj private static exception test2 stri...