Porady: definiowanie klasy, która może zapewnić identyczną funkcjonalność różnych typów danych (Visual Basic)
Można zdefiniować klasę, z której można tworzyć obiekty, które zapewniają identyczne funkcje dla różnych typów danych. W tym celu należy określić co najmniej jeden parametr typu w definicji. Klasa może następnie służyć jako szablon dla obiektów, które używają różnych typów danych. Klasa zdefiniowana w ten sposób jest nazywana klasą ogólną.
Zaletą definiowania klasy ogólnej jest to, że definiujesz ją tylko raz, a kod może użyć go do utworzenia wielu obiektów, które używają szerokiej gamy typów danych. Powoduje to lepszą wydajność niż zdefiniowanie klasy z typem Object
.
Oprócz klas można również definiować i używać struktur ogólnych, interfejsów, procedur i delegatów.
Aby zdefiniować klasę z parametrem typu
Zdefiniuj klasę w normalny sposób.
Dodaj
(Of
parametr typeparameter)
bezpośrednio po nazwie klasy, aby określić parametr typu.Jeśli masz więcej niż jeden parametr typu, utwórz listę rozdzielaną przecinkami w nawiasach. Nie powtarzaj słowa kluczowego
Of
.Jeśli kod wykonuje operacje na parametrze typu innym niż proste przypisanie, postępuj zgodnie z tym parametrem typu z klauzulą
As
, aby dodać co najmniej jedno ograniczenie. Ograniczenie gwarantuje, że typ podany dla tego parametru typu spełnia wymagania, takie jak następujące:Obsługuje operację, taką jak
>
, którą wykonuje kodObsługuje element członkowski, taki jak metoda, do którego uzyskuje dostęp kod
Uwidacznia konstruktor bez parametrów
Jeśli nie określisz żadnych ograniczeń, jedynymi operacjami i elementami członkowskimi, których może używać kod, są obsługiwane przez typ danych obiektu. Aby uzyskać więcej informacji, zobacz Typ lista.
Zidentyfikuj każdy element członkowski klasy, który ma zostać zadeklarowany przy użyciu podanego typu, i zadeklaruj go
As
typeparameter
. Dotyczy to magazynu wewnętrznego, parametrów procedury i zwracanych wartości.Upewnij się, że kod używa tylko operacji i metod obsługiwanych przez dowolny typ danych, które może dostarczyć do metody
itemType
.W poniższym przykładzie zdefiniowano klasę, która zarządza bardzo prostą listą. Zawiera on listę w tablicy
items
wewnętrznej , a użycie kodu może zadeklarować typ danych elementów listy. Konstruktor sparametryzowany umożliwia użycie kodu w celu ustawienia górnejitems
granicy elementu , a konstruktor bez parametrów ustawia tę wartość na 9 (łącznie 10 elementów).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
Możesz zadeklarować klasę z
simpleList
, aby przechowywać listęInteger
wartości, inną klasę do przechowywania listyString
wartości, a drugą do przechowywaniaDate
wartości. Z wyjątkiem typu danych składowych listy obiekty utworzone na podstawie wszystkich tych klas zachowują się identycznie.Argument typu, który używa kodu dostarcza,
itemType
może być typem wewnętrznym, takim jakBoolean
lubDouble
, struktura, wyliczenie lub dowolny typ klasy, w tym typ, który definiuje aplikacja.Klasę
simpleList
można przetestować przy użyciu następującego kodu.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