Eigenschaften benutzerdefinierter Klassen ◦ Zusammenfassung ◦ ?

Die Eigenschaften eines Objektes werden in VBA im Wesentlich durch öffentliche Variablen in einem Klassenmodul beschrieben. Die Telefonverzeichnis-Anwendung hat zum Beispiel Telefonbucheinträge (Objekte) mit den Eigenschaften Name und Telefon durch folgende Anweisungen in einem Klassenmodul cEintrag dargestellt:

    Public Name As String
    Public Telefon As String

Der Name des Klassenmoduls wird im Standardmodul bei der Vereinbarung von Objektvariablen und beim Erstellen von Instanzen als Objekttyp angegeben:

    '--- vereinbare Objektvariablen
    Dim Person1 As cEintrag
    Dim Person2 As cEintrag
    Dim Person3 As cEintrag
    '--- erstelle Instanzen und lasse Objektvariablen darauf verweisen
    Set Person1 = New cEintrag
    Set Person2 = New cEintrag
    Set Person3 = New cEintrag

Da jedes Objekt einen individuellen Zustand annehmen kann, benötigt jede Instanz einer Klasse einen eigenen Satz an Eigenschaftsvariablen. Die Variablen werden mit der Instanz erstellt und gelöscht. Diese individuellen Variablen einer Instanz bezeichnet man als Instanzvariablen. Variablen, die sich alle Instanzen einer Klasse teilen, bezeichnet man dagegen als Klassenvariablen. Klassenvariablen werden eher selten benötigt, und wir werden nicht weiter darauf eingehen.

Der Zugriff auf die Werte einer Eigenschaft erfolgt über den Punktoperator. Erst die Angabe einer Instanz vor dem Punkt, identifiziert die Variable, auf die zugegriffen werden soll eindeutig, zum Beispiel im Standardmodul:

    '--- greife auf Eigenschaften zu
    Person1.Name = "Blaise" & " " & "Pascal"
    Person2.Name = "Konrad" & " " & "Zuse"
    gesuchterName = Person1.Name                '->"Blaise Pascal"

Werden Eigenschaften durch öffentliche Variablen beschrieben, so erhält jeder Benutzer, in dem Rahmen, den der Datentyp festlegt, uneingeschränkte Schreib- und Leserechte. Die folgende Anweisung im Standardmodul ist also zulässig, wenn man cEintrag wie oben definiert:

    Person3.Name = "  Claude Shannon"

Anwendungsentwickler wünschen sich oft, auf solche Zugriffe reagieren oder sie sogar verhindern zu können. Wird nämlich Person3 wie oben angegeben im Telefonverzeichnis gespeichert, so wird eine spätere Suche nach "Claude Shannon" erfolglos enden, da der Vergleich mit " Claude Shannon" aufgrund der führenden Leerzeichen scheitert.

Eine Lösung des Problems besteht darin, mit Hilfe von Prozeduren den Zugriff auf eine Variable einzuschränken. Dazu sperrt man zunächst alle Zugriffsrechte, indem man die Variable als privat vereinbart. Anschliessend lässt man die Wertzuweisung über eine öffentliche Sub-Prozedur gezielt wieder zu. Über eine Funktion kann man den Wert gezielt zurückgeben lassen.

Die folgenden Zeilen des Klassenmoduls implementieren auf diese Weise die Name-Eigenschaft der Klasse cEintrag neu. Die Anweisung Trim() entfernt alle führenden und nachfolgenden Leerzeichen einer Zeichenkette:

    Private Name As String

    Public Sub LetName(neuerName As String)
      'entferne führende und nachgestellte Leerzeichen
      Name = Trim(neuerName)
    End Sub

    Public Function GetName() As String
      GetName = Name
    End Function

Leider ist der Zugriff auf die Eigenschaft nach gewohnter Syntax damit nicht mehr möglich. Anstatt der Eigenschaft einen Wert über den '='-Operator zuzuweisen, muss er der LetName-Prozedur als Argument übergeben werden. Ausserdem müssen die Prozeduren für den Schreib- und Lesezugriff verschieden benannt werden. Dafür ist die Variable Name nun wirklich vor direktem Zugriff geschützt:

    '--- greife auf Eigenschaften zu
    Person.LetName " Shannon "         'Schreibzugriff aus dem Standardmodul
    gesuchterName = Person.GetName()   'Lesezugriff->"Shannon"

Einen Ausweg aus dem Dilemma bieten Property-Prozeduren.

©abo