#vb.net #generics #class #collections
Вопрос:
Я хочу создать коллекцию в VB.NET, но я хочу, чтобы он принимал только объекты определенного типа. Например, я хочу создать класс под названием «FooCollection», который во всех отношениях действует как коллекция, но принимает только объекты типа «Foo».
Я думал, что смогу сделать это с помощью дженериков, используя следующий синтаксис:
Public Class FooCollection(Of type As Foo)
Inherits CollectionBase
...
End Class
Но при компиляции я получаю сообщение об ошибке, что я «должен реализовать средство доступа по умолчанию», поэтому очевидно, что чего-то не хватает. Я не хочу указывать тип, который он принимает, когда я создаю экземпляр — я хочу, чтобы сама коллекция FOO указывала, что она принимает только объекты Foo. Я видел, как это делалось в C# со строго типизированным списком, так что, возможно, все, что я ищу, это VB.NET синтаксис.
Спасибо за вашу помощь!
ПРАВКА: Спасибо за ответ. Это сделало бы это, но я хотел, чтобы тип класса был назван определенным образом, я на самом деле выполнил именно то, что искал, со следующим кодом:
Public Class FooCollection
Inherits List(Of Foo)
End Class
Ответ №1:
Почему бы тебе просто не использовать List(Of Foo)
… Он уже находится в VB.NET под System.Collections.Generic
. Для использования просто объявите как таковой:
Private myList As New List(Of Foo) 'Creates a Foo List'
Private myIntList As New List(Of Integer) 'Creates an Integer List'
См MSDN > List(T) Class (System.Collections.Generic)
.для получения дополнительной информации.
Комментарии:
1. Это зависит от того, что он делает. Список<T> предназначен для внутреннего использования в коде приложения. Вам следует избегать написания общедоступных API, которые принимают или возвращают список<T> — вместо этого рассмотрите возможность использования суперкласса или интерфейса коллекции.
Ответ №2:
Вам нужно было реализовать свойство по умолчанию для коллекции, подобное этому:
Default Public Property Item(ByVal Index As Integer) As Foo
Get
Return CType(List.Item(Index), Foo)
End Get
Set(ByVal Value As Foo)
List.Item(Index) = Value
End Set
Конечное Свойство