三、定义一个泛型类
泛型类与普通类一样定义在相同的实例中,只有一个区别。当你有一些数据和多于一个方法并且其间有关密切的关系时,你可以定义一个普通类。当方法和数据工作在一个密切的单元中并且该数据可以被进一步抽象,以至相同的代码可以支持许多数据类型时,你最好定义一个泛型类。例如,队列、列表和堆栈并不在乎它们存储的东西,而仅在乎怎样存储这些东西。如果你使用一个其中存储有对象的队列、堆栈或列表,那么你不得不在你的代码的很多地方进行繁琐的类型转化。如果你使用一个泛型队列、堆栈或列表,那么类型转化只是发生在该类内部。这就是说,繁琐的类型转化场所集中于该类的一个内部点上,而该类的用户可以依赖编译器来进行类型检查,并不要求用户执行if条件检查和类型变换。
定义一个泛型类就象定义多个泛型方法,只是多了一点:(Of T)构造也可以用于类的头部。为了说明问题,假定你已定义了一个派生于System.Collections.CollectionBase的泛型的强类型集合(见列表3)。那么现在,你可以把这个类使用于任何数据类型,就好象你已针对所有类型定义了一个定制的类型化的集合:
列表3:一个泛型的强类型集合
Module Module1 Sub Main() Dim BrokenBones As TypedCollection(Of OrthoInjury) = New TypedCollection(Of OrthoInjury) BrokenBones.Add(New OrthoInjury(True,"Broken Right Clavicle", "Vicodin; Heals n 8 to 12 weeks")) BrokenBones.Add(New OrthoInjury(True, "Fractured Posterior Rib #5", "Heals in 6 to 8 weeks")) BrokenBones.Add(New OrthoInjury(True, "Fractured Posterior Rib #1", "Heals in 6 to 8 weeks")) Dim injury As OrthoInjury For Each injury In BrokenBones Console.WriteLine("Description: " & injury.Description) Next Console.ReadLine() End Sub End Module Public Class TypedCollection(Of T) Inherits System.Collections.CollectionBase Default Public Property Item(ByVal Index As Integer) As T Get Return CType(List(Index), T) End Get Set(ByVal value As T) List(Index) = value End Set End Property Public Function Add(ByVal value As T) As Integer Return List.Add(value) End Function End Class Public Class OrthoInjury Private FHasXray As Boolean Private FDescription As String Private FPrognosis As String
Public Sub New(ByVal HasXray As Boolean, ByVal Description As String, ByVal Prognosis As String) FHasXray = HasXray FDescription = Description FPrognosis = Prognosis End Sub Public Property HasXray() As Boolean Get Return FHasXray End Get Set(ByVal value As Boolean) FHasXray = value End Set End Property Public Property Description() As String Get Return FDescription End Get Set(ByVal value As String) FDescription = value End Set End Property Public Property Prognosis() As String Get Return FPrognosis End Get Set(ByVal value As String) FPrognosis = value End Set End Property End Class |
如果你读过以前关于类型化的集合的文章,那么你会看到类型化的集合泛型(列表3中的粗体部分)基本上是一种数据类型被参数化的强类型的集合。
四、使用预定义的泛型类
幸好,你不需要从头开始定义泛型类。System.Collections.Generics命名空间已定义好了许多典型的数据结构用作泛型,例如List,Queue和Stack。你仅需要简单地导入该命名空间并声明一个你需要的类型的实例即可。例如,下列代码充分地实现用.NET 2.0泛型List类型化的集合来替换你的定制的类型化的集合:
Dim BrokenBones As System.Collections.Generic.List(Of OrthoInjury) = _ New System.Collections.Generic.List(Of OrthoInjury) |
作为一个一般规则,如果你想要存储多于一个类型(异类类型),可以使用更旧的风格类,如Queue和Stack。如果你只想使用一种类型(同类类型),可以使用在System.Collections.Generic命名空间中的新的泛型类。通常情况下,你应使用新的泛型类。
五、选择所学
能够把传统的复杂的如C++这样的语言与传统的简单的如VB这样的语言隔离开来的东西越来越少了。乍看起来,这种事实有点令人心灰意冷,因为这就意味着如今的VB越发难学了-就象C++一样。不过事实上,任何一种语言(包括VB)的核心往往是非常相似的;而即使象C++这样的语言,你也总可以选择学习如泛型这样更高级的概念,如果你需要它们的话。总之,你可以选择任何你想学的东西。
还应记住,你总是可以选择学习任何编程相关的高级概念-开始作为一个使用者-使用其中的内容,例如泛型List;然后作为一个创建者,学习怎样创建你自己的东西。总而言之,想短时间内学精每一件技术可能无法实现,而且也完全没有必要。 
2/2 首页 上一页 1 2 |