Anvisningar: Definiera en klass som kan tillhandahålla identiska funktioner för olika datatyper (Visual Basic)
Du kan definiera en klass från vilken du kan skapa objekt som ger identiska funktioner för olika datatyper. För att göra detta anger du en eller flera typparametrar i definitionen. Klassen kan sedan fungera som en mall för objekt som använder olika datatyper. En klass som definieras på det här sättet kallas för en generisk klass.
Fördelen med att definiera en allmän klass är att du definierar den bara en gång, och koden kan använda den för att skapa många objekt som använder en mängd olika datatyper. Detta resulterar i bättre prestanda än att definiera klassen med Object
typen .
Förutom klasser kan du även definiera och använda allmänna strukturer, gränssnitt, procedurer och ombud.
Så här definierar du en klass med en typparameter
Definiera klassen på normalt sätt.
Lägg till
(Of
typeparameter)
direkt efter klassnamnet för att ange en typparameter.Om du har fler än en typparameter skapar du en kommaavgränsad lista inom parenteserna. Upprepa inte nyckelordet
Of
.Om koden utför åtgärder på en annan typparameter än enkel tilldelning följer du den parametern med en
As
sats för att lägga till en eller flera begränsningar. En begränsning garanterar att den typ som anges för den typparametern uppfyller ett krav, till exempel följande:Stöder en åtgärd, till exempel , som
>
koden utförHar stöd för en medlem, till exempel en metod, som din kod kommer åt
Exponerar en parameterlös konstruktor
Om du inte anger några begränsningar är de enda åtgärder och medlemmar som koden kan använda de som stöds av objektdatatypen. Mer information finns i Typlista.
Identifiera varje klassmedlem som ska deklareras med en angiven typ och deklarera den
As
typeparameter
. Detta gäller för intern lagring, procedurparametrar och returvärden.Se till att koden endast använder åtgärder och metoder som stöds av alla datatyper som den kan ange till
itemType
.I följande exempel definieras en klass som hanterar en mycket enkel lista. Den innehåller listan i den interna matrisen
items
och med hjälp av koden kan deklarera datatypen för listelementen. Med en parameteriserad konstruktor kan du använda kod för att ange den övre gränsen föritems
, och den parameterlösa konstruktorn anger detta till 9 (totalt 10 objekt).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
Du kan deklarera en klass från
simpleList
för att lagra en lista medInteger
värden, en annan klass som innehåller en lista medString
värden och en annan som ska innehållaDate
värden. Förutom datatypen för listmedlemmarna fungerar objekt som skapats från alla dessa klasser på samma sätt.Typargumentet som använder kod för
itemType
kan vara en inbyggd typ somBoolean
ellerDouble
, en struktur, en uppräkning eller någon typ av klass, inklusive en som ditt program definierar.Du kan testa klassen
simpleList
med följande kod.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