Viusal Basic程序员的.NET泛型编程(2)
点击次数:25 次 发布日期:2008-11-26 12:32:48 作者:源代码网
|
源代码网推荐 源代码网推荐 泛型类与普通类一样定义在相同的实例中,只有一个区别。当你有一些数据和多于一个方法并且其间有关密切的关系时,你可以定义一个普通类。当方法和数据工作在一个密切的单元中并且该数据可以被进一步抽象,以至相同的代码可以支持许多数据类型时,你最好定义一个泛型类。例如,队列、列表和堆栈并不在乎它们存储的东西,而仅在乎怎样存储这些东西。如果你使用一个其中存储有对象的队列、堆栈或列表,那么你不得不在你的代码的很多地方进行繁琐的类型转化。如果你使用一个泛型队列、堆栈或列表,那么类型转化只是发生在该类内部。这就是说,繁琐的类型转化场所集中于该类的一个内部点上,而该类的用户可以依赖编译器来进行类型检查,并不要求用户执行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;然后作为一个创建者,学习怎样创建你自己的东西。总而言之,想短时间内学精每一件技术可能无法实现,而且也完全没有必要。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
