Dela via


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

  1. Definiera klassen på normalt sätt.

  2. Lägg till (Of typeparameter) direkt efter klassnamnet för att ange en typparameter.

  3. Om du har fler än en typparameter skapar du en kommaavgränsad lista inom parenteserna. Upprepa inte nyckelordet Of .

  4. 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ör

    • Har 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.

  5. 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.

  6. 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 itemsoch 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ör items, 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 med Integer värden, en annan klass som innehåller en lista med String värden och en annan som ska innehålla Date 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 som Boolean eller Double, 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
    

Se även