C# 泛型的含義
基本集合可以包含在諸如類中,但這些集合是沒有類型化的,所以需要把object項(xiàng)轉(zhuǎn)換為集合中實(shí)際存儲的對象類型。繼承自SyStem.ObjeCt的任何對象都可以存儲在ArrayList中,所以要特別仔細(xì)。假定包含在集合中的某些類型可能導(dǎo)致拋出異常,而且代碼邏輯崩潰。前面介紹的技術(shù)可以處理這個(gè)問題,包括檢查對象類型所需的代碼。
但是,更好的解決辦法是一開始就使用強(qiáng)類型化的集合類"這種集合類派生于CollectionBase,并可以擁有自己的方法,來添加、刪除和訪問集合的成員,但它可能把集合成員限制為派生于某種基本類型,或者必須支持某個(gè)接口。這會帶來一個(gè)問題。每次創(chuàng)建需要包含在集合中的新類時(shí),就必須執(zhí)行下列任務(wù)之一:
?使用某個(gè)集合類,該類己經(jīng)定義為可以包含新類型的項(xiàng)。
?創(chuàng)建一個(gè)新的集合類,它可以包含新類型的項(xiàng),實(shí)現(xiàn)所有需要的方法。
一般情況下,新的類型需要額外功能,所以常常需要用到新的集合類,因此創(chuàng)建集合類會花費(fèi)大量時(shí)間。
另一方面,泛型類大大簡化了這個(gè)問題。泛型類是以實(shí)例化過程中提供的類型或類為基礎(chǔ)建立的,可以毫不費(fèi)力地對對象進(jìn)行強(qiáng)類型化。對于集合,創(chuàng)建“T類型對象的集合”十分簡單,只需要編寫一行代碼即可。不使用下面的代碼:
CollectionClass items = new CollectionClass();
items.Add(new ItemClass());
而是使用:
CollectionClass<ItemClass> items = new CollectionClass<ItemClass>();
items.Add(new ItemClass());
尖括號語法是把類型參數(shù)傳遞給泛型類型的方式。在上面的代碼中,應(yīng)把CollectionClass<ItemClass>看成 ItemClass的CollectionClass。
泛型不只涉及集合,但集合特別適合使用泛型。本章后面介紹?ystem.Collections.Generic名稱空間時(shí)會看到 這一點(diǎn)。創(chuàng)建一個(gè)泛型類,就可以生成一些方法,它們的簽名可以強(qiáng)類型化為我們需要的任何類型,該類型甚至可以是值類型或引用類型,處理各自的操作。還可以把用于實(shí)例化泛型類的類型限制為支持某個(gè)給定的接口,或派生自某種類型,從而只允許使用類型的一個(gè)子集。泛型并不限于類,還可以創(chuàng)建泛型接口、泛型方法(可以在非泛型類上定義),甚至泛型委托。這將極大地提高代碼的靈活性,正確使用泛型可以顯著縮短開發(fā)時(shí)間。
那么該如何實(shí)現(xiàn)泛型呢?通常,在創(chuàng)建類時(shí),它會編譯為一個(gè)類型,然后在代碼中使用。讀者可能認(rèn)為,在創(chuàng)建泛型類時(shí),它只有被編譯為許多類型,才能進(jìn)行實(shí)例化。幸好并不是這樣:在.NET中,類有無限多個(gè)。在后臺,.NET運(yùn)行庫允許在需要時(shí)動態(tài)生成泛型類。在實(shí)例化之前,B的某個(gè)泛型類A甚至不存在。
點(diǎn)擊加載更多評論>>