Практическое руководство. Определение класса, реализующего одинаковую функциональность для различных типов данных (Visual Basic)

Можно определить класс, из которого можно создавать объекты, обеспечивающие одинаковые функциональные возможности для различных типов данных. Для этого укажите в определении один или несколько параметров типа . После этого класс может служить шаблоном для объектов, которые используют различные типы данных. Класс, определенный таким образом, называется универсальным классом.

Преимущество определения универсального класса состоит в том, он определяется только один раз, и код может использовать его для создания многих объектов, использующих разнообразные типы данных. Это дает более высокую производительность, чем при определении класса с помощью типа Object .

Помимо классов, можно определять и использовать универсальные структуры, интерфейсы, процедуры и делегаты.

Определение класса с помощью параметра типа

  1. Определите класс обычным способом.

  2. Добавьте (Oftypeparameter) сразу после имени класса для указания параметра типа.

  3. Если имеется более одного параметра типа, создайте разделенный запятыми список, заключенный в круглые скобки. Не следует повторять ключевое слово Of .

  4. Если код выполняет с параметром типа какие-либо операции, отличные от простого присваивания, следует записать данный параметр типа с условием As для добавления одного или нескольких ограничений. Ограничение гарантирует, что тип, указанный для данного параметра типа, удовлетворяет определенным требованиям:

    • Поддерживает операции, например >, которые выполняются кодом.

    • Поддерживает элементы, например методы, к которым обращается код.

    • Предоставляет конструктор без параметров.

    Если не указаны никакие ограничения, код сможет использовать только операции и элементы, поддерживаемые Object Data Type. Дополнительные сведения см. в разделе Type List.

  5. Определите все элементы класса, объявляемые с помощью указанного типа, и объявите их Astypeparameter. Это относится к внутреннему хранилищу, параметрам процедур и возвращаемым значениям.

  6. Убедитесь, что код использует только операции и методы, поддерживаемые типом данных, который может быть предоставлен для itemType.

    В следующем примере определяется класс, управляющий простым списком. Он хранит список во внутреннем массиве items, и использующий код может объявить тип данных элементов списка. Параметризованный конструктор позволяет использовать код для установки верхней границы items, а конструктор без параметров задает значение 9 (для всего 10 элементов).

    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
    

    Можно объявить один класс из simpleList для хранения списка значений Integer , другой класс — для хранения списка значений String и еще один — для хранения значений Date . Кроме типа данных элементов списка, объекты, созданные из всех этих классов, ведут себя одинаково.

    Аргумент типа, который использующий код указывает для itemType , может быть встроенным типом, например Boolean или Double, структурой, перечислением или любым типом класса, включая определяемый приложением.

    Можно протестировать класс simpleList с помощью следующего кода.

    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
    

См. также