C# 4.0中的協變和逆變(一)

來源:互聯網
上載者:User

在剛剛落下帷幕的PDC上,我們得到了很多振奮的訊息,包括C# 4.0及VS2010等等。Anders Liu 已經 將C# 4.0 新特性白皮書翻譯了 出來,那裡面有非常詳細的介紹。

C#的發展是很快很快的,C#的設計目的是成為一個有趣有用通用的程式語言,並因此讓使用該語言的使用者能獲得更大的成功。所以,C#除了物件導向的基本特徵外,現在引入了相當多的其他特徵喔!

動態,動態。動態是目前超級流行的詞彙。C#也要動起來了喔!

C# 4.0的主要主題是動態編程。對象的意義變得越來越“動態”,它們的結構和行為無法通過靜態類型來捕獲,或者至少編譯器在編譯器時無法得知對象的結構和行為。

相關的特性有動態尋找具名引數選擇性參數等。

還有,簡化了與COM的互操作

還有,協變逆變 Covariance and contravariance

這些都在白皮書裡可以找到介紹。我在這裡整理一下協變和逆變的一些參考資料,本來數學就不好,怕過一兩天就又忘了,俗話說,好記性不如爛筆頭嘛。

首先看看問題的引入。

這裡有兩個類型,T 和 U,在這兩個類型間,以下偽運算式肯定有一個是“真”:

  • T > U
  • T < U
  • T = U
  • T 和 U 沒有任何關係

例如有這些類型:動物 Animal哺乳動物 Mammal爬行動物 Reptile長頸鹿 Giraffe老虎 Tiger蛇 Snake海龜 Turtle,它們之間的繼承關係(應該來個UML就一目瞭然了)有:哺乳動物動物的一個子類,長頸鹿哺乳動物的一個子類等等……

看圖:

那麼就有:哺乳動物長頸鹿大,比動物小,等於哺乳動物,和爬行動物卻沒有關係(這裡的比較都不是對象之間的比較,要注意哦。

呃,如果這個難於理解,我們再看看程式中的情況。假設有一個變數,這個變數在C#中有一個容身之處(不是說的儲存區的物理地址),每一個變數在C#中的容身之處都對應一個類型(強型別語言就是這樣的),那麼,在運行時你可以在一個特定的容身之處儲存對應類型的執行個體或者小於這個類型的類型的執行個體(拗口-,-)。所以呢,哺乳動物對象對應的容身之處可以儲存一個長頸鹿,但是不能儲存一個海龜。(考慮面先介面編程和抽象基類的思想

容身之處這個例子說明的是“交換原則”,跟面向介面編程和抽象基類的機制很類似,也就是在很多地方,我們用子類代替基類(或介面或抽象類別)來使用。

現在來定義什麼是協變:一個操作如果在 T 和 U 兩個類型上執行後返回的 T' 和 U' 之間的關係跟原來的 T 和 U 之間的關係(上面那4個偽運算式)相同,則這個操作就叫做協變。英文名:Covariance。

再看看什麼是逆變:一個操作如果將 T 和 U 的大小關係改變了(大變小,小變大 - 逆轉),但是不改變 T 和 U 之間的相等或不相干這兩個關係,則這個操作就叫做逆變。英文名:Contravariance。

呃呃。變來變去,頭已經暈了。

(還沒完,等我喔!)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.