Gewusst wie: Definieren einer Klasse, die für unterschiedliche Datentypen die gleiche Funktionalität bereitstellen kann

Aktualisiert: November 2007

Sie können eine Klasse definieren, anhand derer Sie Objekte erstellen können, die für unterschiedliche Datentypen die gleiche Funktionalität bereitstellen können. Hierzu geben Sie in der Definition einen oder mehrere Typparameter an. Die Klasse kann dann als Vorlage für Objekte fungieren, die verschiedene Datentypen verwenden. Eine auf diese Weise definierte Klasse wird als generische Klasse bezeichnet.

Das Definieren einer generischen Klasse bietet den Vorteil, dass Sie die Klasse nur einmal definieren und der Code anhand der Klasse zahlreiche Objekte erstellen kann, die eine Vielzahl unterschiedlicher Datentypen verwenden. Dies führt zu einer besseren Leistung als das Definieren der Klasse mit dem Object-Typ.

Außer generischen Klassen können Sie auch generische Strukturen, Schnittstellen, Prozeduren und Delegaten definieren und verwenden.

So definieren Sie eine Klasse mit einem Typparameter

  1. Definieren Sie die Klasse auf die übliche Weise.

  2. Fügen Sie direkt nach dem Klassennamen (Of Typparameter) hinzu, um einen Typparameter anzugeben.

  3. Wenn mehrere Typparameter vorhanden sind, erstellen Sie innerhalb der Klammern eine durch Trennzeichen getrennte Liste. Geben Sie das Of-Schlüsselwort nur einmal an.

  4. Wenn der Code andere Operationen für den Typparameter als eine einfache Zuweisung ausführt, geben Sie nach dem Typparameter eine As-Klausel an, um eine oder mehrere Einschränkungen hinzuzufügen. Eine Einschränkung gewährleistet, dass der für den Typparameter angegebene Typ eine Anforderung erfüllt, z. B. eine der folgenden:

    • Unterstützt eine Operation, z. B. >, die der Code ausführt.

    • Unterstützt einen Member, z. B. eine Methode, auf die der Code zugreift.

    • Macht einen parameterlosen Konstruktor verfügbar.

    Wenn Sie keine Einschränkungen angeben, kann der Code nur Operationen und Member verwenden, die vom Object-Datentyp unterstützt werden. Weitere Informationen finden Sie unter Typenliste.

  5. Bezeichnen Sie jeden Klassenmember, der mit einem angegebenen Typ deklariert werden soll, und deklarieren Sie ihn mit As typeparameter. Dies gilt für die interne Speicherung, für Prozedurparameter und Rückgabewerte.

  6. Der Code darf nur Operationen und Methoden verwenden, die von jedem Datentyp unterstützt werden, der für itemType angegeben werden kann.

    Im folgenden Beispiel wird eine Klasse definiert, die eine sehr einfache Liste verwaltet. Sie enthält die Liste im internen Array items, und der Anwendungscode kann den Datentyp der Listenelemente deklarieren. Mithilfe eines parametrisierten Konstruktors kann der Anwendungscode die Obergrenze von items festlegen, und der Standardkonstruktor legt sie auf 9 (für insgesamt 10 Elemente) fest.

    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
    

    Sie können eine Klasse aus simpleList deklarieren, die eine Liste von Integer-Werten enthält, eine andere Klasse, die eine Liste von String-Werten enthält, und eine weitere Klasse, die Date-Werte enthält. Außer in Bezug auf den Datentyp der Listenmember verhalten sich die aus allen diesen Klassen erstellten Objekte gleich.

    Das vom Anwendungscode für itemType bereitgestellte Typargument kann ein systeminterner Typ ein, z. B. Boolean oder Double, eine Struktur, eine Enumeration oder jeder Klassentyp, einschließlich eines von der Anwendung definierten Klassentyps.

    Sie können die Klasse simpleList mit dem folgenden Code testen.

    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 As String = _
        "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
    

Siehe auch

Aufgaben

Gewusst wie: Verwenden einer generischen Klasse

Konzepte

Datentypen in Visual Basic

Generische Typen in Visual Basic

CLS (Common Language Specification)

Referenz

Of

Typenliste

Object-Datentyp