Поделиться через


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

Обновлен: Ноябрь 2007

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

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

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

Чтобы определить класс с параметром типа

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

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

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

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

    • Поддерживает операцию, например >, которую воспроизводит код

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

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

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

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

  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 As String = _
        "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
    

См. также

Задачи

Практическое руководство. Использование универсального класса

Основные понятия

Типы данных в Visual Basic

Универсальные типы в Visual Basic

Спецификация CLS

Ссылки

Of

Список типов

Тип данных Object