泛型(Generics)是Visual Basic 2005中的一種新特性,泛型可以使你在程式設計過程中體會到更多的快樂。你不需要額外的工作就能體會到代碼重用(reuse)的優點。
一、泛型的優點
使用泛型可以提高性能,其中顯著的一個改進是.NET架構元件不會在值類型上使用裝箱(boxing);使用泛型類的另一個令人驚訝的特性是IntelliSense居然可以跟蹤強資料類型定義。
這個類的聲明看起來很常見,但是請留意“(Of ItemType)”條目。這個條目就是泛型類與标準類的差别。你可以把它看作是一個占位符,在未來執行個體化這個類的時候,你需要提供類型。當.NET架構元件發現這個條目的時候,它用使用這個類的代碼所提供的類型來替換這個條目。當然,你沒有必要在類中使用ItemType(資料項類型)——你可以把泛型類随便叫什麼名字,就像為變量命名一樣。
二、建立泛型類
使用泛型的時候,你應該選擇有廣泛用途的類,這樣的話建立泛型類所需要的時間最終會在減少開發時間方面給予你回報。例如,集合就是一種處理多個資料類型的類,并且一般你會在多個應用程式中使用同一個集合的多種不同的形式。你不需要每次根據草稿建立集合,而是使用泛型建立一個泛型類原型(prototype)。首先,你需要給代碼添加如下所示的Imports語句:Imports System.Collections.Generic
添加Imports語句之後,你就可以建立泛型類了。基本的類看起來很常見。你可以使用屬性、函數、子程式、字段或可以在類中使用的其它任何東西,如清單1所示:
Public Class MyGenericCollection(Of ItemType)
' 定義一個通用的集合
Private Items As Collection(Of ItemType)
' 建立構造函數
Public Sub New()
Items = New Collection(Of ItemType)
End Sub
' 傳回集合中資料項的數量
Public ReadOnly Property Count() As Integer
Get
Return Items.Count
End Get
End Property
' 得到或設定一個特定的資料項
Default Public Property Item(ByVal Index As Integer) As ItemType
Get
Return Items(Index)
End Get
Set(ByVal value As ItemType)
Items(Index) = value
End Set
End Property
' 給集合添加新的資料項
Public Sub Add(ByVal Value As ItemType)
Items.Add(Value)
End Sub
' 從集合中删除資料項
Public Sub RemoveAt(ByVal Item As Int32)
Items.RemoveAt(Item)
End Sub
End Class
三、使用泛型類
我們在上面建立的泛型類在使用方法上與其他類沒有什麼不同,仍然需要将其執行個體化。
Private Sub btnTest_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnTest.Click
' 建立新集合
Dim CollectInt As New MyGenericCollection(Of String)
' 在集合上執行某些事務
CollectInt.Add("One")
CollectInt.Add("Two")
CollectInt.Add("Three")
CollectInt.RemoveAt(1)
' 顯示一些統計資訊
MessageBox.Show("Number of Entries: " + CollectInt.Count.ToString())
MessageBox.Show("Value of First Item: " + CollectInt(0))
End Sub
四、限制泛型類
也許你對執行個體中泛型類能夠接受任何資料類型感恐懼,你不得不擔心在使用中出現程式仍然會對錯誤參數産生反映,對,是存在這樣的風險,不過我們可以對泛型類加以限制。
你可以通過修改聲明來限制泛型類,使它隻能接受Address資料類型。例如,你可能希望改變清單1中的集合,如下所示:
Public Class MyGenericCollection(Of ItemType As Address)
這個泛型類現在隻能接受Address資料類型。任何其它的用法都會産生錯誤(IDE拒絕編譯代碼)。你可以把任何通用類型(包括接口)作為限制。例如,你可能希望定義一個泛型類,它隻能接受實作IcustomFormatter接口的資料類型。
五、為泛型類定義多個類型
你不必僅僅使用一種資料類型定義每個類,泛型類也提供多個資料類型,你所需要做的是用逗号分開每種資料類型。
你不必僅僅使用一種資料類型定義每個類。幸運的是,泛型類也提供多個資料類型。你所需要做的是用逗号分開每種資料類型,如下所示:
Public Class MyGenericCollection(Of ItemType1, ItemType2, ItemType3)
這個聲明接受三個輸入的資料類型(不能多,也不能少)。在例子中,代碼在資料類型上沒有做任何限制,但是你可以輕易地根據需要添加限制。實際上,你可以在同一個聲明中帶有和不帶限制、混合和比對資料類型,帶有限制的資料類型不必擁有相同的限制類型。你可以包含一個使用特定類和另一個依賴于某種接口的資料類型。
Imports System.Reflection
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As Object = Activator.CreateInstance(Type.GetType("A.a")) '工程名稱.類名
Dim MyProperty As PropertyInfo = o.GetType().GetProperty("NAME")
Dim objValue As Object = "Bbb"
MyProperty.SetValue(o, objValue, Nothing)
Dim objReturn() As Object
MsgBox(MyProperty.GetValue(o, objReturn).ToString())
End Sub
End Class
Public Class a
private _name As String
Public _id As Integer
Public Property NAME() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
End Class