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
Definieren Sie die Klasse auf die übliche Weise.
Fügen Sie direkt nach dem Klassennamen (Of Typparameter) hinzu, um einen Typparameter anzugeben.
Wenn mehrere Typparameter vorhanden sind, erstellen Sie innerhalb der Klammern eine durch Trennzeichen getrennte Liste. Geben Sie das Of-Schlüsselwort nur einmal an.
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.
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.
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
Generische Typen in Visual Basic
CLS (Common Language Specification)