一篇文章看懂C#中的協(xié)變、逆變_第1頁
一篇文章看懂C#中的協(xié)變、逆變_第2頁
一篇文章看懂C#中的協(xié)變、逆變_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第一篇文章看懂C#中的協(xié)變、逆變官方:協(xié)變和逆變都是術語,前者指能夠使用比原始指定的派生類型的派生程度更大(更具體的)的類型,后者指能夠使用比原始指定的派生類型的派生程度更小(不太具體的)的類型。[MSDN]

公式:

協(xié)變:IFoo父類=IFoo子類;

逆變:IBar子類=IBar父類;

暫時不理解沒關系,您接著往下看。

2.協(xié)變(Covariance)

1)out關鍵字

對于泛型類型參數(shù),out關鍵字可指定類型參數(shù)是協(xié)變的。可以在泛型接口和委托中使用out關鍵字。[MSDN]

2)魯迅:一張圖勝過千言萬語(圖小看不清,單機鼠標右鍵-在新標簽頁中打開圖片)

備注:泛型委托的協(xié)變原理也是一樣的。

3)什么是協(xié)變?

協(xié)變就是對具體成員的輸出參數(shù)進行一次類型轉換,且類型轉換的準則是“里氏替換原則”。

3.逆變(Contravariance)

1)in關鍵字

對于泛型類型參數(shù),in關鍵字可指定類型參數(shù)是逆變的??梢栽诜盒徒涌诤臀兄惺褂胕n關鍵字。[MSDN]

2)魯迅:一張圖勝過千言萬語(圖小看不清,單機鼠標右鍵-在新標簽頁中打開圖片)

備注:泛型委托的逆變原理也是一樣的。

3)什么是逆變?

逆變就是對具體成員的輸入?yún)?shù)進行一次類型轉換,且類型轉換的準則是“里氏替換原則”。

4.自問自答

1)協(xié)變、逆變?yōu)槭裁粗荒茚槍Ψ盒徒涌诨蛘呶??而不能針對泛型類?/p>

因為它們都只能定義方法成員(接口不能定義字段),而方法成員在創(chuàng)建對象的時候是不涉及到對象內存分配的,所以它們是類型(內存)安全的。

為什么不針對泛型?因為泛型類是模板類,而類成員是包含字段的,不同類型的字段是影響對象內存分配的,沒有派生關系的類型它們是不兼容的,也是內存不安全的。

2)協(xié)變、逆變?yōu)槭裁词穷愋桶踩模?/p>

本質上是里氏替換原則,由里氏替換原則可知:派生程度小的是派生程度大的子集,所以子類替換父類的位置整個程序功能都不會發(fā)生改變。

3)官方對協(xié)變、逆變的定義現(xiàn)在是否能看懂?

上面看懂了,官方定義肯定也是沒問題的。派生程度小可以理解為基類,派生程度大可以理解為子類或派生類,至于為什么用程度這個詞,是因為繼承鏈的深度是沒限制的。

總結

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論