Comment : convertir une collection personnalisée en collection typée Visual Basic
Mise à jour : novembre 2007
Dans Visual Basic 6.0, une collection personnalisée limite le contenu d'une collection à une classe particulière. Elle est également appelée collection typée. Visual Basic 2008 fournit plusieurs options pour créer des classes typées à partir des collections personnalisées de Visual Basic 6.0. Cette rubrique contient trois procédures, chacune affichant une option différente.
Cette rubrique suppose que la collection personnalisée de Visual Basic 6.0 a été créée à l'aide de l'utilitaire Class Builder. Une telle collection possède les membres suivants :
Ajouter Ajoute une nouvelle instance de la classe personnalisée à la collection.
Élément Retourne une instance de la collection basée sur un index dans la collection.
Nombre Retourne le nombre d'instances dans la collection.
Supprimer Supprime une instance de la collection basée sur un index dans la collection.
Énumération Prend en charge l'énumération à l'aide de la syntaxe For Each.
Pour utiliser l'Assistant Mise à niveau pour créer une collection
Ouvrez le projet Visual Basic 6.0 dans Visual Basic 2008. Pour une classe de collection nommée Forest qui contient des instances de la classe Tree, le code mis à niveau est indiqué ci-dessous. L'avantage de cette méthode est qu'aucune modification du code n'est requise.
' For this example, the Tree class has no members. Option Strict Off Option Explicit On Friend Class Tree End Class Friend Class Forest Implements System.Collections.IEnumerable 'local variable to hold collection Private mCol As Collection Public Function Add(Optional ByRef sKey As String = "") As Tree 'create a new object Dim objNewMember As Tree objNewMember = New Tree 'set the properties passed into the method If Len(sKey) = 0 Then mCol.Add(objNewMember) Else mCol.Add(objNewMember, sKey) End If 'return the object created Add = objNewMember 'UPGRADE_NOTE: Object objNewMember may not be destroyed until it is garbage collected. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1029"' objNewMember = Nothing End Function Default Public ReadOnly Property Item(ByVal vntIndexKey _ As Object) As Tree Get 'used when referencing an element in the collection 'vntIndexKey contains either the Index or Key to the collection, 'this is why it is declared as a Variant 'Syntax: Set foo = x.Item(xyz) or Set foo = x.Item(5) Item = mCol.Item(vntIndexKey) End Get End Property Public ReadOnly Property Count() As Integer Get 'used when retrieving the number of elements in the 'collection. Syntax: Debug.Print x.Count Count = mCol.Count() End Get End Property 'UPGRADE_NOTE: NewEnum property was commented out. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1054"' 'Public ReadOnly Property NewEnum() As stdole.IUnknown 'Get 'this property allows you to enumerate 'this collection with the For...Each syntax 'NewEnum = mCol._NewEnum 'End Get 'End Property Public Function GetEnumerator() As System.Collections.IEnumerator _ Implements System.Collections.IEnumerable.GetEnumerator 'UPGRADE_TODO: Uncomment and change the following line to return the collection enumerator. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1055"' 'GetEnumerator = mCol.GetEnumerator End Function Public Sub Remove(ByRef vntIndexKey As Object) 'used when removing an element from the collection 'vntIndexKey contains either the Index or Key, which is why 'it is declared as a Variant 'Syntax: x.Remove(xyz) mCol.Remove(vntIndexKey) End Sub 'UPGRADE_NOTE: Class_Initialize was upgraded to Class_Initialize_Renamed. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1061"' Private Sub Class_Initialize_Renamed() 'creates the collection when this class is created mCol = New Collection End Sub Public Sub New() MyBase.New() Class_Initialize_Renamed() End Sub 'UPGRADE_NOTE: Class_Terminate was upgraded to Class_Terminate_Renamed. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1061"' Private Sub Class_Terminate_Renamed() 'destroys collection when this class is terminated 'UPGRADE_NOTE: Object mCol may not be destroyed until it is garbage collected. Click for more: 'ms-help://MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="vbup1029"' mCol = Nothing End Sub Protected Overrides Sub Finalize() Class_Terminate_Renamed() MyBase.Finalize() End Sub End Class
.NET Framework et Visual Basic 2008 offrent plusieurs collections génériques. L'avantage d'utiliser des classes génériques est que très de code est requis pour implémenter la classe.
Pour créer une collection à l'aide de collections génériques
Créez la définition de classe. Voici un exemple de classe Tree :
Public Class Tree Public Species As String End Class
Créez une classe de liste générique à partir de .NET Framework. Cette déclaration remplace essentiellement la classe Forest tout entière dans la procédure mentionnée ci-dessus intitulée « Pour utiliser l'Assistant Mise à niveau pour créer une collection ».
Dim forest As New System.Collections.Generic.List(Of Tree)
Écrivez du code pour accéder à l'objet Liste. Le code suivant ajoute cinq instances de la classe Tree à la collection puis les imprime.
For count As Integer = 1 To 5 Dim sapling As New Tree sapling.Species = "oak" Forest.Add(sapling) Next For Each sapling As Tree In Forest MsgBox(sapling.Species) Next
.NET Framework contient la classe CollectionBase. Les collections typées sont créées en héritant de CollectionBase. Cette méthode utilise moins de code que la méthode de l'Assistant Mise à niveau, mais plus que la solution générique. Elle plus flexible que la solution générique, parce que le programmeur peut ajouter des membres supplémentaires à la classe de collection.
Pour créer une collection à partir de la classe CollectionBase
Créez la définition de classe. Voici un exemple de classe Tree :
Public Class Tree Public Species As String End Class
Créez une classe qui hérite de la classe CollectionBase. Ajoutez, au minimum, une méthode Add et une propriété Item. Elles rendent la classe de collection fortement typée.
Class TreeCollection Inherits System.Collections.CollectionBase Public Sub Add(ByVal value As Tree) Me.List.Add(value) End Sub Default Public Property Item(ByVal index As Integer) As Tree Get Return CType(Me.List(index), Tree) End Get Set(ByVal value As Tree) If index <= Me.Count - 1 Then Me.List(index) = value Else Throw New IndexOutOfRangeException() End If End Set End Property End Class
Écrivez du code pour accéder à l'objet Liste. Le code suivant ajoute cinq instances de la classe Tree à la collection puis les imprime.
Dim forest As New TreeCollection
For count As Integer = 1 To 5 Dim sapling As New Tree sapling.Species = "oak" Forest.Add(sapling) Next For Each sapling As Tree In Forest MsgBox(sapling.Species) Next