Objekte erzeugen: Der Konstruktor Eigener Konstruktor

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