如何:定义可对不同数据类型提供相同功能的类 (Visual Basic)

可以定义这样一个类:您将能够依据该类来创建可在不同数据类型上提供相同功能的对象。为此,您可以在定义中指定一个或多个类型参数。然后,该类将能够充当使用不同数据类型的对象的模板。通过这种方式定义的类称为泛型类。

定义泛型类这种做法的优点在于:您只需定义一次泛型类,代码就可以利用它来创建使用各种数据类型的多个对象。相对于利用 Object 类型定义类而言,这样做的性能将会更好。

除了类之外,您还可以定义和使用泛型结构、接口、过程和委托。

利用类型参数定义类

  1. 采用常规方式定义类。

  2. 紧接在类名之后,添加 (Of typeparameter) 以指定一个类型参数。

  3. 如果有一个以上的类型参数,请在括号内列出这些参数(以逗号分隔)。不要重复 Of 关键字。

  4. 如果代码是对类型参数执行操作,而不是简单的赋值,请在该类型参数后添加一个 As 子句,以便添加一个或多个约束。约束可保证为该类型参数提供的类型可满足如下的类似要求:

    • 支持代码执行的运算(如 >)

    • 支持代码访问的成员(如方法)

    • 公开无参数构造函数

    如果未指定任何约束,则代码只能使用 Object 数据类型 支持的那些运算和成员。有关更多信息,请参见 类型列表 (Visual Basic)

  5. 标识要使用提供的类型声明的每个类成员,然后将其声明为 As typeparameter。这适用于内部存储、过程参数和返回值。

  6. 确保代码只使用它可提供给 itemType 的任何数据类型所支持的运算和方法。

    下面的示例定义一个类,用于管理一个非常简单的列表。它将列表保存在内部数组 items 中,并且使用代码可声明列表元素的数据类型。参数化构造函数允许使用代码设置 items 的上限,默认构造函数将此上限设置为 9(总共 10 项)。

    Public Class simpleList(Of itemType)
      Private items() As itemType
      Private top As Integer
      Private nextp As Integer
      Public Sub New()
        Me.New(9)
      End Sub
      Public Sub New(ByVal t As Integer)
        MyBase.New()
        items = New itemType(t) {}
        top = t
        nextp = 0
      End Sub
      Public Sub add(ByVal i As itemType)
        insert(i, nextp)
      End Sub
      Public Sub insert(ByVal i As itemType, ByVal p As Integer)
        If p > nextp OrElse p < 0 Then
          Throw New System.ArgumentOutOfRangeException("p", 
            " less than 0 or beyond next available list position")
        ElseIf nextp > top Then
          Throw New System.ArgumentException("No room to insert at ", 
            "p")
        ElseIf p < nextp Then
          For j As Integer = nextp To p + 1 Step -1
            items(j) = items(j - 1)
          Next j
        End If
        items(p) = i
        nextp += 1
      End Sub
      Public Sub remove(ByVal p As Integer)
        If p >= nextp OrElse p < 0 Then
            Throw New System.ArgumentOutOfRangeException("p", 
                " less than 0 or beyond last list item")
        ElseIf nextp = 0 Then
            Throw New System.ArgumentException("List empty; cannot remove ", 
                "p")
        ElseIf p < nextp - 1 Then
            For j As Integer = p To nextp - 2
                items(j) = items(j + 1)
            Next j
        End If
        nextp -= 1
      End Sub
      Public ReadOnly Property listLength() As Integer
        Get
          Return nextp
        End Get
      End Property
      Public ReadOnly Property listItem(ByVal p As Integer) As itemType
        Get
          If p >= nextp OrElse p < 0 Then
            Throw New System.ArgumentOutOfRangeException("p", 
              " less than 0 or beyond last list item")
            End If
          Return items(p)
        End Get
      End Property
    End Class
    

    可以依据 simpleList 声明一个类来保存 Integer 值的列表,声明另一个类来保存 String 值的列表,并再声明一个类来保存 Date 值。除了列表成员的数据类型外,依据所有这些类创建的对象的工作方式都相同。

    使用代码提供给 itemType 的类型变量可以是内部类型(如 Boolean 或 Double)、结构、枚举或任何类型的类(包括应用程序定义的类)。

    可以使用以下代码测试类 simpleList。

    Public Sub useSimpleList()
      Dim iList As New simpleList(Of Integer)(2)
      Dim sList As New simpleList(Of String)(3)
      Dim dList As New simpleList(Of Date)(2)
      iList.add(10)
      iList.add(20)
      iList.add(30)
      sList.add("First")
      sList.add("extra")
      sList.add("Second")
      sList.add("Third")
      sList.remove(1)
      dList.add(#1/1/2003#)
      dList.add(#3/3/2003#)
      dList.insert(#2/2/2003#, 1)
      Dim s = 
        "Simple list of 3 Integer items (reported length " &
         CStr(iList.listLength) & "):" &
         vbCrLf & CStr(iList.listItem(0)) &
         vbCrLf & CStr(iList.listItem(1)) &
         vbCrLf & CStr(iList.listItem(2)) &
         vbCrLf &
         "Simple list of 4 - 1 String items (reported length " &
         CStr(sList.listLength) & "):" &
         vbCrLf & CStr(sList.listItem(0)) &
         vbCrLf & CStr(sList.listItem(1)) &
         vbCrLf & CStr(sList.listItem(2)) &
         vbCrLf &
         "Simple list of 2 + 1 Date items (reported length " &
         CStr(dList.listLength) & "):" &
         vbCrLf & CStr(dList.listItem(0)) &
         vbCrLf & CStr(dList.listItem(1)) &
         vbCrLf & CStr(dList.listItem(2))
      MsgBox(s)
    End Sub
    

请参见

任务

如何:使用泛型类 (Visual Basic)

参考

Of 子句 (Visual Basic)

类型列表 (Visual Basic)

Object 数据类型

概念

Visual Basic 中的数据类型

Visual Basic 中的泛型类型 (Visual Basic)

公共语言规范