AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VB编程

Viusal Basic程序员的.NET泛型编程

51自学网 http://www.wanshiok.com

  三、定义一个泛型类

  泛型类与普通类一样定义在相同的实例中,只有一个区别。当你有一些数据和多于一个方法并且其间有关密切的关系时,你可以定义一个普通类。当方法和数据工作在一个密切的单元中并且该数据可以被进一步抽象,以至相同的代码可以支持许多数据类型时,你最好定义一个泛型类。例如,队列、列表和堆栈并不在乎它们存储的东西,而仅在乎怎样存储这些东西。如果你使用一个其中存储有对象的队列、堆栈或列表,那么你不得不在你的代码的很多地方进行繁琐的类型转化。如果你使用一个泛型队列、堆栈或列表,那么类型转化只是发生在该类内部。这就是说,繁琐的类型转化场所集中于该类的一个内部点上,而该类的用户可以依赖编译器来进行类型检查,并不要求用户执行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;然后作为一个创建者,学习怎样创建你自己的东西。总而言之,想短时间内学精每一件技术可能无法实现,而且也完全没有必要。

 
 

上一篇:在VB环境中操作三维模型的实现方法  下一篇:VB6中使用错误处理对程序速度的影响