Object Pascal im Detail - Objektorientierung www.delphi-treff.de
97
type TFigur = class
private FX: Integer;
FY: Integer; public
function LiesXKoordinate: XKoordinate; property X: XKoordinate read LiesXKoordinate;
end; Eine Methode für write muss genau einen Aufrufparameter besitzen, der ebenfalls dem Typ der Eigenschaft
entspricht. Beispiel: type
TFigur = class private
FX: Integer; FY: Integer;
public procedure SetzeXKoordinatex: XKoordinate;
property X: XKoordinate write SetzeXKoordinate; end;
Hinter read und write selbst wird immer nur der reine Methodenname ohne Parameter oder Rückgabewert angegeben.
Enthält eine Eigenschaft nur eine read-Angabe, kann sie nur gelesen werden; enthält sie nur eine write-Angabe, kann sie nur geschrieben werden.
Properties können nicht als var-Parameter eingesetzt werden, da es sich bei ihnen ja nicht um direkte Zugriffe auf Felder handeln muss; sondern es können ja
„nur Methoden dahinter stecken.
4.8.5.4. Objekte erzeugen: Der Konstruktor
Instanzen einer Klasse entstehen erst dadurch, dass sie ausdrücklich erzeugt werden. Dies geschieht mit dem Konstruktor
„Create . „Konstruktor bezeichnet jemanden, der etwas konstruiert, also erzeugt. Man könnte „Create auch eine Methode nennen; es gibt jedoch einen großen Unterschied: Methoden können nur
aufgerufen werden, wenn die Instanz bereits existiert. Ausnahme davon sind Klassenmethoden. Der Konstruktor dagegen erzeugt die Instanz aus dem Nichts.
Der Konstruktor muss nicht von uns programmiert werden. Der Standard- Ko st ukto „C eate ist auto atis h
immer vorhanden. So wird eine Instanz erzeugt:
Object Pascal im Detail - Objektorientierung www.delphi-treff.de
98
Objektreferenz := Klasse.Create; Damit wird Speicherplatz für alle Attribute der Klasse im Hauptspeicher reserviert und die zugehörige Adresse
in der Variablen „O jekt efe e z gespeichert.
Beim Erzeugen einer Klasse werden die jeweils vorhandenen Attribute mit folgenden Startwerten belegt: Alle Datenfelder mit einem ganzzahligen Datentyp z.B. Integer werden mit 0 initialisiert.
Alle Datenfelder mit einem String-Typ werden durch eine leere Zeichenkette initialisiert. Alle Datenfelder mit einem Zeigertyp werden mit dem Wert nil initialisiert.
Alle Datenfelder mit einem Gleitkommazahlentyp z.B. Real werden mit 0.0 initialisiert.
„C eate ka ü ige s au h a ei e O jekt efe e z aufge ufe e de . Dadu h i d da kei e eue Instanz erzeugt, sondern die bereits initialisierten Felder des Objekts mit neuen Werten überschrieben, was zu
Speicherlecks führen kann. Will man ein Objekt neu initialisieren, sollte man eine eigene Methode für diese Aktion bereitstellen.
4.8.5.5. Eigener Konstruktor
Es ist möglich, für jede Klasse einen eigenen Konstruktor sowie einen eigenen Destruktur, der das Gegenstück zum Konstruktor ist und dessen reservierten Speicher wieder freigibt, zu schreiben. Besonders bei
Konstruktoren kann das sinnvoll sein, weil der von TObject geerbte Konstruktor „Create nicht unbedingt das
ausführt, was man sich wünscht. Eigene Konstruktoren können ebenfalls
„Create heißen, wodurch das ursprüngliche „Create verdeckt wird – sie können aber auch ganz andere Namen haben, wobei man sich an den Namen
„Create halten sollte, um den Code einheitlicher und somit lesbarer zu machen.
Damit trotzdem auch der Code des verdeckten Konstruktors ausgeführt wird, muss zu Beginn des eigenen Konstruktors
„inherited aufge ufe e de :
constructor TMyClass.Create; begin
inherited; Ruft den Konstruktor der Oberklasse auf
Hier Werte initialisieren o.ä. end;
Klei e Ei s hu zu „i he ited : Heißt die Methode de O e klasse ge auso u d e a tet kei e Pa a ete , so genügt das Schlüsselwort inherited. Unterscheidet sich die Methode der Oberklasse im Namen oder den
erwarteten Parametern, so muss hinter inherited ihr Name und ihre Parameter angegeben werden, z.B.: inherited MyCreate1;
Was es genau mit Oberklassen auf sich hat, wird im folgenden Kapitel zum Thema Vererbung erklärt.
Object Pascal im Detail - Objektorientierung www.delphi-treff.de
99
Das Kennzeichen eines Konstruktors ist, dass er an einer Klasse nicht an einer Instanz aufgerufen wird, wodurch eine Instanz erzeugt wird Reservierung von Speicher usw.. Der Aufruf normaler Methoden, die mit
procedure oder function beginnen, ist erst möglich, wenn eine Instanz existiert. Um dies zu unterschieden, beginnt die Deklaration eines Konstruktors mit dem Schlüsselwort
„constructor : type
TFigur = class private
FX: Integer; FY: Integer;
public procedure Ziehex: XKoordinate; y: YKoordinate;
function IstZugErlaubtx: XKoordinate; y: YKoordinate: Boolean; constructor Createx: XKoordinate; y: YKoordinate;
end;
4.8.5.6. Objekte freigeben: Der Destruktor