Como: Converter uma coleção personalizada para uma coleção tipada Visual Basic
Uma coleção personalizada Visual Basic 6.0 limita o conteúdo de uma coleção para uma classe específica.Isso também é conhecido sistema autônomo uma coleção tipada.Visual Basic 2008 fornece várias opções para criar classes de tipos de coleções personalizadas do Visual Basic 6.0. Este tópico contém três procedimentos, cada um mostrando uma opção diferente.
Este tópico pressupõe que a coleção personalizada Visual Basic 6.0 foi criado usando o Class Builder Utility.Uma coleção deste tipo possui os seguintes membros:
Adicionar Adiciona uma nova instância da classe personalizada à coleção.
Item Retorna uma instância de uma coleção com base em um índice na coleção.
Contar Retorna o número de instâncias na coleção.
Remover Remove uma instância da coleção com base em um índice na coleção.
Enumeração Oferece suporte para enumerações usando o For Each sintaxe.
Usando o assistente para atualização para criar uma coleção
Abra o projeto Visual Basic 6.0 em Visual Basic 2008. Para um conjunto de classe nomeada Forest que contém as instâncias das Tree classe, o código atualizado é mostrado abaixo. A vantagem desse método é que nenhuma alteração no código é necessária.
' 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
The .NET Framework e Visual Basic 2008 oferecem várias coleções genéricas. A vantagem de usar classes genéricas é que muito pouco código é necessário para implementar a classe.
Criando uma coleção usando coleções genéricas
Crie a definição da classe.Aqui está um exemplo de um Tree classe:
Public Class Tree Public Species As String End Class
Crie uma classe lista genérica do .NET Framework. Essa declaração essencialmente substitui o inteiro Forestclasse no procedimento acima chamado "usar o Assistente de atualização para criar uma coleção."
Dim forest As New System.Collections.Generic.List(Of Tree)
Escreva o código para acessar o objeto lista.O código a seguir adiciona cinco instâncias do Tree classe de coleção e, em seguida, os 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
The .NET Framework inclui o CollectionBase classe. Coleções tipadas são criadas por herança da CollectionBase. Esse método usa menos código do que o método do Assistente de atualização, mas mais do que a solução genéricos.É mais flexível do que a solução de classes genéricas, pois o programador pode adicionar membros adicionais à classe de coleção.
Criando uma coleção da classe CollectionBase
Crie a definição da classe.Aqui está um exemplo de um Tree classe:
Public Class Tree Public Species As String End Class
Criar uma classe que herda a partir de CollectionBase classe. No mínimo, adicione um Add método e um Item propriedade. Isso faz da classe coleção fortemente tipada-.
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
Escreva o código para acessar o objeto lista.O código a seguir adiciona cinco instâncias do Tree classe de coleção e, em seguida, os 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