Практическое руководство. Определение класса, реализующего одинаковую функциональность для различных типов данных (Visual Basic)
Можно определить класс, из которого можно создавать объекты, обеспечивающие одинаковые функциональные возможности для различных типов данных. Для этого укажите в определении один или несколько параметров типа . После этого класс может служить шаблоном для объектов, которые используют различные типы данных. Класс, определенный таким образом, называется универсальным классом.
Преимущество определения универсального класса состоит в том, он определяется только один раз, и код может использовать его для создания многих объектов, использующих разнообразные типы данных. Это дает более высокую производительность, чем при определении класса с помощью типа 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