使用泛型类
使用上面的代码中的泛型类与使用任何其它的类只有稍微的差别。你仍然需要实例化这个类,并且你也可以使用方法、属性和事件,与使用其它类相似。列表2显示了使用列表1中定义的泛型类的典型示例:
列表2.使用泛型类
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 |
btnTest_Click()方法从建立一个新集合开始。请注意实例化CollectInt对象的代码。与正常的方法不同,它需要开发者提供集合的数据类型。在示例中“(Of String)”条目指定这个集合将接收String(字符串)类型的值。
CollectInt被实例化了之后,代码使用CollectInt的方法向集合添加值,并从集合中删除值。这与操作标准的类没有任何区别,因此通常你在操作基于泛型类的对象的时候,不必改变任何技术。
在使用几个方法操作了第一个数据项(Two)之后,代码以显示集合中数据项的数量和第一个数据项结束。同样,在使用这个对象的时候你不需要做任何专门的工作。Count属性与你预想的工作方式相同。当你处理默认属性Item的时候,你会发现没有必要执行向String类型的转换(conversion)。其原因在于IDE和.NET框架组件都知道你建立的集合使用了String数据类型。此外,IntelliSense也知道它是String数据类型的,如图1所示。请注意,你接受的是特定的String类型的信息,而不是使用Object时接收的通用类型。
图1.使用泛型意味着从IntelliSense中得到特定数据类型的反馈 |
约束泛型类 当你看列表1的时候,你可能开始对泛型类有如此的作用感到惊讶,因为示例类可以接受任何的数据类型。幸运的是,你可以约束泛型类,使它仅仅接受一种特定的数据类型。例如,你可以建立如下所示的一个Address数据类型类:
Public Class Address Public Name As String Public Address1 As String Public Address2 As String Public City As String Public State As String Public ZIP As String End Class |
你可以通过修改声明来约束泛型类,使它只能接受Address数据类型。例如,你可能希望改变列表1中的集合,如下所示:
Public Class MyGenericCollection(Of ItemType As Address) |
这个泛型类现在只能接受Address数据类型。任何其它的用法都会产生错误(IDE拒绝编译代码)。你可以把任何通用类型(包括接口)作为约束。例如,你可能希望定义一个泛型类,它只能接受实现IcustomFormatter接口的数据类型。
为泛型类定义多个类型 你不必仅仅使用一种数据类型定义每个类。幸运的是,泛型类也提供多个数据类型。你所需要做的是用逗号分开每种数据类型,如下所示:
Public Class MyGenericCollection(Of ItemType1, ItemType2, ItemType3) |
这个声明接受三个输入的数据类型(不能多,也不能少)。在例子中,代码在数据类型上没有做任何约束,但是你可以轻易地根据需要添加约束。实际上,你可以在同一个声明中带有和不带约束、混合和匹配数据类型,带有约束的数据类型不必拥有相同的约束类型。你可以包含一个使用特定类和另一个依赖于某种接口的数据类型。
总结 尽管泛型类起先看起来仅仅是前进的一步,但是它们实际上是.NET革命中的一个巨大飞跃。使用泛型把你从为每个数据类型建立新类中释放了出来,提高了性能,并减少了开发和调试的时间。为了体会Visual Studio 2005中最好的部分,你真的应该试着使用这个新特性——你会发现自己将很喜欢它的。
查看本文来源