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