2008-10-10 11 views
9

Je veux créer une collection dans VB.NET, mais je veux seulement qu'elle accepte des objets d'un certain type. Par exemple, je veux créer une classe appelée "FooCollection" qui agit comme une collection dans tous les sens, mais n'accepte que les objets de type "Foo".VB.NET Collection fortement typée

Je pensais que je pouvais le faire à l'aide de médicaments génériques, en utilisant la syntaxe suivante:

Public Class FooCollection(Of type As Foo) 
     Inherits CollectionBase 

     ... 

    End Class 

Mais je reçois une erreur quand je le compiler que je « doit mettre en œuvre un accesseur par défaut », si bien qu'il ya quelque chose qui manque. Je ne veux pas spécifier le type qu'il accepte quand j'instancie - Je veux que FooCollection lui-même soit spécifique pour accepter uniquement les objets Foo. Je l'ai vu en C# avec une liste typée, donc tout ce que je recherche est la syntaxe VB.NET.

Merci pour votre aide!

EDIT: Merci pour la réponse. Ce serait le faire, mais je voulais avoir le nom classtype d'une certaine façon, je fait accompli exactement ce que je cherchais avec le code suivant:

Public Class FooCollection 
    Inherits List(Of Foo) 

End Class 

Répondre

10

Pourquoi ne pas simplement utiliser un List(Of Foo) .. Il est déjà dans VB.NET sous System.Collections.Generic. Pour l'utiliser, il suffit de déclarer comme tel:

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

Voir MSDN > List(T) Class (System.Collections.Generic) pour plus d'informations.

+0

Cela dépend de ce qu'il fait. La liste est destinée à un usage interne dans le code de l'application. Vous devez éviter d'écrire des API publiques qui acceptent ou renvoient la liste - à la place, utilisez une superclasse ou une interface de collection. –

1

Vous aviez besoin de mettre en œuvre une propriété par défaut pour la collection comme ceci:

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 Property