如何:定義可以在不同資料類型上提供完全相同功能的類別 (Visual Basic)

您可以定義一個類別,以從中建立可在不同資料類型上提供相同功能的物件。 若要這樣做,請在定義中指定一個或多個 「類型參數」 (type parameter)。 類別之後可以作為使用各種資料類型之物件的範本。 使用這種方法所定義的類別稱為 「泛型類別」(generic class)。

定義泛型類別的優點是只需要定義一次,而且您的程式碼可以使用它來建立許多使用各種資料類型的物件。 這所導致的效能優於定義具有 Object 類型的類別。

除了類別之外,您還可以定義和使用泛型結構、介面、程序和委派。

定義具有類型參數的類別

  1. 以一般方式定義類別。

  2. 立即在類別名稱後面加入 (Of類型參數) ,以指定類型參數。

  3. 如果您有多個類型參數,請在括號內建立以逗號分隔的清單。 請不要重複 Of 關鍵字。

  4. 如果您的程式碼對類型參數執行簡單指派以外的作業,請在該類型參數後面加上 As 子句來加入一個或多個 「條件約束」(constraint)。 條件約束保證針對該類型參數所提供的類型符合下列這類需求:

    • 支援您程式碼所執行的作業 (例如 >)

    • 支援您程式碼所存取的成員 (例如方法)

    • 公開無參數建構函式

    如果您未指定任何條件約束,則您程式碼可使用的唯一作業和成員是 Object Data Type所支援的作業和成員。 如需詳細資訊,請參閱 Type List

  5. 識別要宣告所提供類型的每個類別成員,並將它宣告為 Astypeparameter。 這適用於內部儲存體、程序參數和傳回值。

  6. 請確定您的程式碼只會使用它可提供給 itemType之任何資料類型所支援的作業和方法。

    下列範例定義可管理極簡單清單的類別。 它會將清單保留在內部陣列 items中,而 using 程式碼可以宣告清單項目的資料類型。 參數化建構函式可讓使用中的程式碼設定 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 值。 除了清單成員的資料類型之外,從所有這些類別建立之物件的行為都相同。

    using 程式碼提供給 itemType 的類型引數可以是內建類型 (例如 BooleanDouble)、結構、列舉值或任何類型的類別 (包括您應用程式所定義的其中一個類別)。

    您可以使用下列程式碼測試 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
    

另請參閱