VB.NET Строго типизированная коллекция

#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
 

Конечное Свойство