Практическое руководство. Определение класса, реализующего одинаковую функциональность для различных типов данных
Обновлен: Ноябрь 2007
Можно определить класс, из которого можно создавать объекты, обеспечивающие одинаковые функциональные возможности для различных типов данных. Для этого необходимо указать в определении один или несколько параметров типов. Класс может служить в качестве шаблона для объектов, которые используют различные типы данных. Определенный таким образом класс называется универсальным классом.
Преимуществом определения универсального класса является то, что его нужно определять только один раз, и код может использовать его для создания многих объектов, использующих разнообразные типы данных. Это приводит к повышению производительности, по сравнению с определением класса с типом Object.
В дополнение к классам можно также определять и использовать универсальные структуры, интерфейсы, процедуры и делегаты.
Чтобы определить класс с параметром типа
Определите класс обычным способом.
Добавьте (Oftypeparameter) сразу же после имени класса для указания параметра типа.
Если имеется более одного параметра типа, следует сделать список с элементами, разделенными запятыми. Не следует повторять ключевое слово Of.
Если код выполняет операции с параметром типа, отличным от простого присваивания, следует записать данный параметр типа с условием As для добавления одного или нескольких ограничений. Ограничение гарантирует, что тип, предоставленный для данного параметра типа, удовлетворяет следующим требованиям:
Поддерживает операцию, например >, которую воспроизводит код
Поддерживает элементы, такие как методы, к которым имеет доступ код
Предоставляет конструктор без параметров
Если не указаны никакие ограничения, код может использовать только операции и элементы, поддерживаемые Тип данных Object. Дополнительные сведения см. в разделе Список типов.
Определите каждый элемент класса, объявляемый с предоставленным типом, и объявите его как As typeparameter. Это относится к внутренним хранилищам данных, параметрам процедур и возвращаемым значениям.
Убедитесь, что код использует только операции и методы, поддерживаемые каким-либо типом данных, из поставляемых им для 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