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

  1. Zdefiniuj klasę w normalny sposób.

  2. Dodaj (Ofparametr typeparameter) bezpośrednio po nazwie klasy, aby określić parametr typu.

  3. Jeśli masz więcej niż jeden parametr typu, utwórz listę rozdzielaną przecinkami w nawiasach. Nie powtarzaj słowa kluczowego Of .

  4. 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 kod

    • Obsł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.

  5. Zidentyfikuj każdy element członkowski klasy, który ma zostać zadeklarowany przy użyciu podanego typu, i zadeklaruj go Astypeparameter. Dotyczy to magazynu wewnętrznego, parametrów procedury i zwracanych wartości.

  6. 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 itemswewnętrznej , a użycie kodu może zadeklarować typ danych elementów listy. Konstruktor sparametryzowany umożliwia użycie kodu w celu ustawienia górnej itemsgranicy 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 listy String wartości, a drugą do przechowywania Date 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 jak Boolean lub Double, 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
    

Zobacz też