4.4 Definieren von Eigenschaften mit property

Eine Eigenschaft ist eine Variable mit einem bestimmten Gültigkeitsbereich. Lingo kennt 3 Gültigkeitsbereiche. Dieser Bereich beschreibt, an welchen Stellen im Skript Variablen ausgelesen bzw. gesetzt werden können.

Variablentyp Codewort Gültigkeit
lokale Variablen kein Codewort nötig Lokale Variablen haben nur innerhalb des eigenen Handlers Gültigkeit.
globale Variablen global Globale Variablen haben in allen Skripten Gültigkeit, auch über den Directorfilm, in dem sie definiert werden, hinaus. Voraussetzung ist, dass sie im jeweiligen Skript als global definiert werden.
Eigenschaften property Eigenschaften haben nur in einer Objektinstanz Gültigkeit. Sie können innerhalb der Instanz direkt, außerhalb der Instanz über eine Referenz angesprochen werden.

 


Konvention
Es ist allgemein üblich, dass Namen für globale Variablen mit einem kleinen g anfangen, z.B. gPunktestand, gUsername. Eigenschaften fangen meist mit einem m für "member" an, z.B. mBreite, mDatei. Es ist aber auch nicht unüblich, ein p für "property" zu verwenden.


Wir wollen nun das Parent-Skript GrussObjekt schreiben, dass eine anpassbare hallo-Methode besitzt.

property mGrusstext

on new me
mGrusstext = "Hallo."
return me
end new

on hallo me
put mGrusstext
end hallo

Hier sehen wir eine weitere Aufgabe des new-Handlers, nämlich die Eigenschaftsvariablen auf einen definierten Anfangszustand zu setzen. Es ist daher üblich, die Werte, die das Objekt zum initialisieren braucht, gleich dem new-Handlers zu übergeben. Das sieht in unserem Beispiel so aus:

on new me, grussText
mGrusstext = grussText
return me
end new

Das Objekt wird dann folgendermaßen erzeugt:

objekt = script("GrussObjekt").new("Hallo")


Achtung
Die Werte der Argumente müssen explizit den Eigenschaften zugeordnet werden! Eine Methode der Form

on new me, mGrusstext
return me
end new

würde den Wert der Eigenschaft mGrusstext nicht verändern!


Wenn wir den Wert einer Eigenschaft ändern wollen, gibt es dafür zwei Möglichkeiten:

1. das direkte Setzen der Eigenschaft

objekt.mGrusstext = "Guten Tag"

2. das Setzen der Eigenschaft durch eine Methode

objekt.setGruss("Guten Tag")

Wobei setGruss: folgendermaßen aussieht:

on setGruss me, grusstext
mGrussText = grusstext
end setGruss

Analog dazu gibt es zwei Möglichkeiten, eine Eigenschaft auszulesen:

1. das direkte Auslesen der Eigenschaft

put objekt.mGrusstext

2. das Auslesen der Eigenschaft durch eine Methode

objekt.getGruss()

Wobei getGruss: folgendermaßen aussieht:

on getGruss me
return mGrussText
end getGruss

Obwohl es auf den ersten Blick umständlich erscheint, ist das Lesen und Setzen von Eigenschaften durch eine Methode eine empfehlenswerte Vorgehensweise. Der Zugriff auf Eigenschaften ist transparenter und leichter nachvollziehbar. Es ist sehr einfach, nachträglich Funktionalitäten zu ergänzen oder Debug-Nachrichten auszugeben. In unserem Beispiel kann es zum Beispiel später nötig sein, dass mGrusstext eine Zeichenkette ist. Dann muss die Funktion setGrusstext() nur ergänzt werden:

on setGruss me, grusstext
mGrussText = string(grusstext)
end setGruss

Dies ist einfacher, als die unter Umständen zahlreichen Zugriffe auf mGrusstext im nachhinein abzuändern.

Methoden, die Eigenschaften setzen, heißen in Lingo üblicherweise set + Eigenschaftsname. Methoden, die Eigenschaften auslesen, heißen üblicherweise get + Eigenschaftsname.

Quellcode des Beispiels

4.3 Methoden definieren 4.5 Beispiel 1: Zini