Visual Basic bietet mit dem Klassenmodell eine hervorragende Möglichkeit
Daten während der Laufzeit zu speichern. Wo Arrays und normale Collections an
ihre Grenzen stoßen fangen Klassenauflistungen an Ihre Stärken auszuspielen.
Eine Auflistung in VB ist nichts anderes als ein Container für eine normale
Klasse mit Eigenschaften, in dem die einzelnen Elemente in einer Collection
verwaltet werden, also eine Klassen-Collection mit Verwaltungsfunktionen.
Der VB-Klassengenerator leistet einen guten Beitrag bei der Erstellung von
Auflistungen, auch wenn der Code danach etwas verbesserungswürdig ist. Man erreicht
ihn in der VB-IDE über das Menü "Add-Ins", wenn er als Add-In bereits eingebunden
ist. Über das Menü "Datei\Neu\Auflistung" im Klassengenerator öffnet sich der
Auflistungsgeneratordialog. Am einfachsten lässt man diesen die Auflistungsklasse
und die Eigenschaftsklasse zusammen generieren.
Hier ein Beispiel für eine einfache Kontakt-Klasse mit Auflistung:
Im Anschluss kann man im Klassengenerator die Eigenschaften der Contact-Klasse
festlegen.
Über "Datei\Projekt aktualisieren" werden schließlich die beiden neuen Klassen
in der IDE generiert.
In der Auflistungsklasse sind nun, neben den Class_Initialize-
und Class-Terminate-Methoden, 2 weitere Methoden und
3 Eigenschaften enthalten:
- Add (Methode)
- Remove (Methode)
- Count (Eigenschaft)
- Item (Eigenschaft)
- NewEnum (Eigenschaft)
Wie bereits erwähnt ist der dabei entstehende Code nicht optimal, insbesondere
wenn wir später die Klon-Funktionalität in die Auflistungsklasse einbauen möchten.
So kann man beim Hinzufügen neuer Elemente zur Auflistung zwar einen Schlüssel
(Key) angeben und später über diesen auf die Elemente zugreifen, aber man kann
ihn nicht auslesen. Da hilft, wenn man aus dem Key eine eigene Eigenschaft (Property
Get und Property Let) macht und die Add-Methode der Auflistungsklasse entsprechend
anpasst:
Public Function Add( _
FirstName As String, _
LastName As String, _
EMail As String, _
Optional Key As String) As Contact
'neues Objekt erstellen
Dim objNewMember As Contact
Set objNewMember = New Contact
'die Eigenschaften festlegen, die der Methode übergeben werden
objNewMember.FirstName = FirstName
objNewMember.LastName = LastName
objNewMember.EMail = EMail
If Len(sKey) = 0 Then
mCol.Add objNewMember
Else
objNewMember.Key = Key
mCol.Add objNewMember, Key
End If
'das erstellte Objekt zurückgeben
Set Add = objNewMember
Set objNewMember = Nothing
End Function
Mit einer solchen Auflistung kann man nun wunderbar Daten während der Laufzeit
zwischenspeichern und mit ihnen arbeiten. So ist es z.B. möglich Datenbanktabellen
mit mehreren Untertabellen beim Start einer Anwendung komplett in eine entsprechend
angelegte Auflistungsstruktur zu laden, um die Datenbankzugriffe zu minimieren.
Das Klonen
In manchen Situationen macht es nun Sinn eine zuvor gefüllte Auflistung zu
kopieren, um dann mit der Kopie weiterzuarbeiten, ohne die Ursprungsauflistung
anzutasten. Dies ist aber nicht so ohne weiteres möglich, denn das reine Instanzieren
einer neuen Auflistung und das Übertragen der Daten mit der SET-Methode bringt
es mit sich, dass Änderungen an der Kopie immer auch an das Original weitergereicht
werden.
Was wir brauchen ist eine komplett abgekoppelte Klasseninstanz. Dies wird
erreicht, in dem wir eine neue Methode in die Auflistungsklasse einbauen, die
nichts anderes tut, als jedes Element der eigenen Klassen-Collection in eine
neue Instanz von sich selbst zu kopieren und diese Instanz an die aufrufende
Funktion zurückzugeben:
Public Function Clone() As Contacts
Dim objClass As New Contacts
Dim obj As Contact
Set objClass = New Contacts
For Each obj In mCol
objClass.Add _
obj.FirstName, _
obj.LastName, _
obj.EMail, _
obj.Key
Next
Set Clone = objClass
End Function
Nun kommt auch die Veränderung an der Add-Methode zum Tragen, denn ohne die
Key-Eigenschaft wäre es nicht möglich eine exakte Kopie der Auflistung zu erhalten.
Downloads
ClassClone.zip