C#泛型(三)

五、泛型類

泛型類封裝了不針對任何特定數據類型的操作。泛型類常用於容器類,如鏈表、哈希表、棧、隊列、樹等等。這些類中的操作,如對容器添加、刪除元素,不論所存儲的數據是何種類型,都執行幾乎同樣的操作。

對大多數情況,推薦使用.NET框架2.0類庫中所提供的容器類。有關使用這些類的詳細信息,請參見基礎類庫中的泛型。

通常,從一個已有的具體類來創建泛型類,並每次把一個類型改爲類型參數,直至達到一般性和可用性的最佳平衡。當創建你自己的泛型類時,需要重點考慮的事項有:
l 哪些類型應泛化爲類型參數。一般的規律是,用參數表示的類型越多,代碼的靈活性和複用性也就越大。過多的泛化會導致代碼難以被其它的開發人員理解。
l 如果有約束,那麼類型參數需要什麼樣約束。一個良好的習慣是,儘可能使用最大的約束,同時保證可以處理所有需要處理的類型。例如,如果你知道你的泛型類只打算使用引用類型,那麼就應用這個類的約束。這樣可以防止無意中使用值類型,同時可以對T使用as運算符,並且檢查空引用。
l 把泛型行爲放在基類中還是子類中。泛型類可以做基類。同樣非泛型類的設計中也應考慮這一點。泛型基類的繼承規則 。
l 是否實現一個或多個泛型接口。例如,要設計一個在基於泛型的容器中創建元素的類,可能需要實現類似IComparable的接口,其中T是該類的參數。

泛型概述中有一個簡單泛型類的例子。

類型參數和約束的規則對於泛型類的行爲(behavior)有一些潛在的影響,——尤其是對於繼承和成員可訪問性。在說明這個問題前,理解一些術語十分重要。對於一個泛型類Node,客戶代碼既可以通過指定一個類型參數來創建一個封閉構造類型(Node),也可以保留類型參數未指定,例如指定一個泛型基類來創建開放構造類型(Node)。泛型類可以繼承自具體類、封閉構造類型或開放構造類型:
在我的下載也中創建了一個C#的泛型類

// concrete type
class Node<T> : BaseNode
//closed constructed type
class Node<T> : BaseNode<int>
//open constructed type
class Node<T> : BaseNode<T>

非泛型的具體類可以繼承自封閉構造基類,但不能繼承自開放構造基類。這是因爲客戶代碼無法提供基類所需的類型參數。

//No error.
class Node : BaseNode<int>
//Generates an error.
class Node : BaseNode<T>

泛型的具體類可以繼承自開放構造類型。除了與子類共用的類型參數外,必須爲所有的類型參數指定類型,如下代碼所示:
//Generates an error.
class Node<T> : BaseNode<T, U> {…}
//Okay.
class Node<T> : BaseNode<T, int>{…}

繼承自開放結構類型的泛型類,必須指定:
Generic classes that inherit from open constructed types must specify must specify constraints that are a superset of, or imply, the constraints on the base type:

class NodeItem<T> where T : IComparable<T>, new() {…}
class MyNodeItem<T> : NodeItem<T> where T : IComparable<T> , new(){…}


泛型類型可以使用多種類型參數和約束,如下:
class KeyType<K,V>{…}
class SuperKeyType<K,V,U> where U : IComparable<U>, where V : new(){…}

開放結構和封閉構造類型型可以用作方法的參數:
void Swap<T>(List<T> list1, List<T> list2){…}
void Swap(List<int> list1, List<int> list2){…}

在我的下載頁中創建了C#的泛型類鏈表,可以查看一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章