Manchmal existieren mehrere gleichartige Unterobjekte. Unsere Autos sollen z. B.
stets 2 Airbags besitzen; einen für den Fahrer und einen für den Beifahrer.
Im Folgenden gehen wir davon aus, dass wir bereits eine Klasse namens Airbag
erstellt haben, die wir als Unterobjekt des Autos nutzen wollen - so, wie wir das
gerade mit dem Radio gemacht haben. Ein Airbag soll
eine Name
-Eigenschaft und eine aktivieren
-Methode haben.
Da aber ein Auto mehrere Airbags hat, benötigt das Auto
-Objekt eine
Auflistung, über die man auf die eigentlichen Airbag-Unterobjekte zugreift.
Dafür stellt VBA das Collection
-Objekt bereit. Wir erstellen also
einfach eine weitere Eigenschaft namens Airbags
vom Typ
Collection
. Anschließend schreiben wir eine Prozedur, die
Airbags
mit Leben füllt.
Auto |
---|
Private myAirbags As New Collection
Public Property Get Airbags() As Collection Set Airbags = myAirbags End Property
Public Sub AirbagsEinbauen() Dim Air1 As New Airbag, Air2 As New Airbag Air1.Name = "Fahrer" Air2.Name = "Beifahrer" myAirbags.Add Air1, "Fahrer" myAirbags.Add Air2, "Beifahrer" End Sub
Wenn nun die Prozedur
AirbagsEinbauen
ausgeführt wird, werden erst zwei neue Airbags deklariert,
die jeweils eine Name
-Eigenschaft zugewiesen bekommen.
Eine Auflistung besitzt stets noch die Eigenschaft Count
:
Debug.Print meinAuto.Airbags.Count 2
Um nicht die Auflistung Airbags
, sondern einen bestimmten Airbag
anzusprechen, verwendet man seine Nummer:
Debug.Print meinAuto.Airbags(1).Name Fahrerairbag
Oft haben die Objekte einer Auflistung einen eindeutigen Bezeichner, den man
anstelle der Nummer verwenden kann, um es anzusprechen. Häufig ist der Bezeichner
identisch mit der Name
-Eigenschaft des Objekts:
meinAuto.Airbags("Fahrer").aktivieren Wahr
Eine Collection
hat zwei wichtige Methoden: Add
und
Remove
. Damit können der Auflistung Objekte hinzugefügt bzw. entfernt
werden. Collection.Add
erwartet mindestens das hinzuzufügende Objekt
als Parameter, außerdem kann man noch eine Zeichenfolge angeben, mit der man das
Objekt eindeutig identifizieren kann. Falls man an einer anderen Stelle innerhalb
der Reihenfolge einfügen will, könnte man als dritten Parameter die Nummer bzw.
die Identifizierungszeichenfolge eines schon vorhandenen Objekts angeben.
Nachdem AirbagsEinbauen()
ausgeführt wurde, können wir die Airbags
als Unterobjekte des Autos ansprechen:
Modul1 |
---|
Public Sub Autos() Dim Familienkutsche As New Auto Familienkutsche.AirbagsEinbauen Familienkutsche.Airbags(1).aktivieren Familienkutsche.Airbags("Beifahrer").aktivieren End Sub
Interessanterweise ist es dem Collection
-Objekt völlig egal, welchen
Datentyp seine Elemente haben. Sie müssen nicht einmal alle den gleichen Datentyp
haben. So gesehen, kann Collection
also auch anstelle von
Arrays verwendet werden, und bietet dabei
sogar noch eine größere Flexibilität. Man sollte nur bedenken, dass diese Flexibilität
zu Lasten der Performance geht, wenn die Collection etwas größer wird oder ständig
Elemente hinzugefügt oder entfernt werden.