В VB 6 нет прямого эквивалента универсальному List<T>
, найденному в VB.NET. Однако в VB 6 есть такая вещь, как Collection
, которая обеспечивает аналогичную функциональность. Основное отличие состоит в том, что VB 6 Collection
имеет не строго типизированный , что означает, что все объекты хранятся как Variants
в коллекции. В некоторых случаях это может быть полезно, поскольку позволяет хранить много разных типов данных в одной коллекции, и фактически VB использует этот объект для внутреннего использования. Достаточно просто использовать Collection
и объекты приведения, когда они извлекаются из класса, но вы мало что можете сделать. Невозможно реализовать строго типизированные коллекции во время выполнения VB.
Как говорится, есть обходной путь, который вы можете реализовать. Подобно тому, как коллекции были реализованы в ранних версиях VB.NET до введения обобщений, вы можете заключить Collection
в класс, где единственный доступ к внутреннему Collection
осуществляется через методы, которые вы открываете из класс . Этот шаблон проектирования обычно называется «пользовательской коллекцией» .
Это дает преимущество автоматической обработки приведения и освобождает потребителей вашего кода от необходимости запоминать детали реализации, подобные этой. Он заботится о (слишком вероятной) возможности того, что вы будете циклически проходить по коллекции во время выполнения, которая должна содержать только один тип объекта, но случайно добавлен второй, несовместимый тип объекта, который вызывает ваш код бросить исключение. Конечно, недостатком является то, что вам придется заново реализовать большую часть функциональности, уже предоставленной объектом Collection
, в виде открытых методов в вашей пользовательской коллекции.
Вот пример того, как вы можете это сделать:
Public Class CustomerCollection
''#Internal collection, exposed by this class
Private m_Customers As Collection
Private Sub Class_Initialize()
''#Set up the internal collection
Set m_Customers = New Collection
End Sub
Public Sub Add(ByVal cust as Customer, Optional ByVal key as String)
''#Add the Customer object to the internal collection
If IsMissing(key) Then
m_Customers.Add cust
Else
m_Customers.Add cust, key
End If
End Sub
Public Property Get Count() As Integer
''#Return the number of objects in the internal collection
Count = m_Customers.Count
End Property
Public Sub Remove(ByVal index As Variant)
''#Remove the specified object from the internal collection,
''# either by its index or its key
m_Customers.Remove index
End Sub
Public Function Item(ByVal index As Variant) as Customer
''#Return the specified object from the internal collection,
''# either by its index or its key
Set Item = m_Customers.Item(index)
End Function
Public Sub Clear()
''#Removes all objects from the internal collection
Set m_Customers = New Collection
End Sub
End Class
Обратите внимание, что для установки свойства Item
пользовательской коллекции в качестве метода коллекции по умолчанию (например, встроенного объекта Collection
) необходимо выполнить следующие действия в среде IDE VB 6:
В меню «Инструменты» нажмите «Атрибуты процедуры»
Выберите имя вашего пользовательского класса в поле со списком «Имя».
Когда появится диалоговое окно, нажмите кнопку «Дополнительно».
Выберите пункт «(По умолчанию)» в поле со списком «Идентификатор процедуры».
Нажмите "ОК"
Если вы также хотите разрешить перечисление своего пользовательского класса с использованием синтаксиса For Each
(также как встроенный объект Collection
), вы можете добавить функцию NewEnum
в свой пользовательский класс:
Public Property Get NewEnum() As IUnknown
''#Provides support for enumeration using For Each
Set NewEnum = m_Customers.[_NewEnum]
End Property
Как только вы это сделаете, вам нужно указать VB использовать это свойство:
Как и раньше, откройте диалоговое окно «Атрибуты процедуры» из меню «Инструменты»
Выберите имя вашего пользовательского класса в поле со списком «Имя».
Когда появится диалоговое окно, нажмите кнопку «Дополнительно».
Введите число «-4» в поле со списком «ИД процедуры».
Нажмите «ОК»