2008-10-10 15 views
9

Chcę utworzyć kolekcję w VB.NET, ale chcę tylko akceptować obiekty określonego typu. Na przykład chcę utworzyć klasę o nazwie "FooCollection", która działa jak kolekcja pod każdym względem, ale akceptuje tylko obiekty typu "Foo".VB.NET Kolekcja silnie typowana

Myślałem, że mogę zrobić to za pomocą rodzajowych, używając następującej składni:

Public Class FooCollection(Of type As Foo) 
     Inherits CollectionBase 

     ... 

    End Class 

Ale pojawia się błąd, gdy mogę skompilować go, że „musi wdrożyć domyślny akcesor”, więc wyraźnie czegoś brakuje. Nie chcę określać typu, który akceptuje, gdy uruchamiam instancję - chcę, aby FooCollection sam był specyficzny, że akceptuje tylko obiekty Foo. Widziałem to zrobić w języku C# z listy typu "strong-typed", więc może wszystko, czego szukam, to składnia VB.NET.

Dzięki za pomoc!

EDYCJA: Dziękuję za odpowiedź. Że zrobi to, ale chciałem mieć ClassType nazwie w określony sposób, tak naprawdę osiągnąć dokładnie to, czego szukałem z następującego kodu:

Public Class FooCollection 
    Inherits List(Of Foo) 

End Class 

Odpowiedz

10

Dlaczego nie można po prostu użyć List(Of Foo) .. Jest już w VB.NET pod System.Collections.Generic. Aby go wykorzystać, po prostu zadeklarować jako takie:

Private myList As New List(Of Foo) 'Creates a Foo List' 
Private myIntList As New List(Of Integer) 'Creates an Integer List' 

Zobacz MSDN > List(T) Class (System.Collections.Generic) aby uzyskać więcej informacji.

+0

To zależy od tego, co robi. Lista jest przeznaczona do użytku wewnętrznego w kodzie aplikacji. Powinieneś unikać pisania publicznych API, które akceptują lub zwracają Listę - rozważaj zamiast tego używanie superklasy lub interfejsu kolekcji. –

1

Potrzebowałeś zaimplementować właściwość domyślną kolekcji tak:

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 

End obiekt