Häufig haben Objekte bestimmte Eigenschaften. Eine Eigenschaft kann man sich als eine Art Variable irgendeines Datentyps vorstellen. IntelliSense zeigt Eigenschaften mit dem Eigenschaften-Symbol.
Eine Eigenschaft eines Autos dürfte die Geschwindigkeit sein. Die Geschwindigkeit
ermitteln wir wohl mit: Debug.Print meinAuto.Geschwindigkeit
und
erhalten eine Zahl zurück. Manche Eigenschaften kann man einfach ändern, indem man
ihnen einen neuen Wert zuweist, andere sind schreibgeschützt. Wir gehen davon aus,
dass man die Geschwindigkeit wirklich einfach wie folgt ändern können soll:
meinAuto.Geschwindigkeit = 120
Definiert man im Deklarationsbereich eines Klassenmoduls öffentliche Variablen,
sind dies Eigenschaften der Klasse. Mit Property
-Prozeduren gibt es
aber eine elegantere und vorteilhaftere Art und Weise, Eigenschaften zu schreiben.
Die Vorteile von Property
-Prozeduren sind so bestechend, dass VBA
Property
nicht auf Klassen beschränkt, sondern es ist empfehlenswert,
damit auch im Deklarationsbereich von Standardmodulen
öffentlich deklarierte Variablen zu
ersetzen. Die Property-Prozeduren bekommen dafür einfach den Namen, den die
entsprechenden Variablen bisher hatten.
Meistens spielen zwei Property-Prozeduren für je eine Eigenschaft zusammen:
Property Let
weist einer Eigenschaft einen Wert zu, Property
Get
gibt den Wert wieder aus. Fehlt Property Let
, ist die
Eigenschaft schreibgeschützt, fehlt Property Get
, kann man den Wert
der Eigenschaft nicht auslesen. Ein weiterer Vorteil von Property
besteht darin, dass der Wert besser gekapselt ist.
Wir schreiben nun gleich drei neue Eigenschaften: strFarbe
speichert
in einer öffentlichen Variable die Farbe des Autos, Geschwindigkeit
die aktuelle Geschwindigkeit. Der Motor soll aber bei 250 abriegeln, ein höherer
Wert ist nicht möglich. Wird das versucht, wird Geschwindigkeit
auf
250 reduziert und die schreibgeschützte Eigenschaft abgeriegelt
springt von False
auf True
.
Auto |
---|
Option Explicit Public strFarbe As String Private bytTempo As Byte Private blnTempoSperre As Boolean
Public Property Let Geschwindigkeit(Speed As Long) If (Speed > 250) Then bytTempo = 250 blnTempoSperre = True Else bytTempo = Speed blnTempoSperre = False End If End Property
Public Property Get Geschwindigkeit() As Long Geschwindigkeit = bytTempo End Property
Public Property Get abgeriegelt() As Boolean abgeriegelt = blnTempoSperre End Property
Das folgende Standardmodul nutzt die Klasse:
Modul1 |
---|
Public Sub Autos() Dim Familienkutsche As New Auto Familienkutsche.strFarbe = "Blau" Familienkutsche.Geschwindigkeit = 320 Debug.Print Familienkutsche.Geschwindigkeit Debug.Print Familienkutsche.abgeriegelt End Sub
Die Eigenschaftswerte werden im Deklarationsbereich der Klasse gespeichert.
In unserem Beispiel können wir übrigens unser Auto nach Belieben umfärben, weil
strFarbe
mit Public
deklariert wurde. Das ist hier
sicherlich nicht sehr sinnvoll, es sind aber auch Fälle denkbar, in denen das
anders ist. Die anderen beiden Werte sind Private
und somit nicht direkt
von außerhalb zu zugänglich. Der Zugriff darauf geschieht über die Property-Prozeduren.
Property Let Geschwindigkeit
legt gleich für beide Eigenschaften den
aktuellen Wert fest, die jeweiligen Property Get
-Prozeduren geben die
Werte wieder zurück.
Interessanterweise wird die Geschwindigkeit als Long
übergeben,
aber in einer Byte
-Variablen gespeichert. Zugleich überwacht der Code,
dass kein Wert größer als 250 gespeichert werden kann.
Außer Property Get
und Property Let
gibt es noch
Property Set
. Property Set
funktioniert im Prinzip genau
wie Property Let
, ist allerdings für die Übergabe von Objektvariablen
gedacht.