Object Pascal
Eigene Konstruktoren und Destruktoren
Eigener Konstruktor
Es ist möglich, für jede Klasse einen eigenen Konstruktor sowie einen eigenen Destruktur 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 überdeckt wird - sie können aber auch ganz andere Namen haben.
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:
interface
type
TBerufstaetig = class(TMensch)
private
FKontoNr: integer;
FBankleitzahl: integer;
public
procedure GehaltZahlen;
constructor Create(Konto, BLZ: integer);
end;
implementation
constructor TBerufstaetig.Create(Konto, BLZ: integer);
begin
inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
{
nun können Initialisierungen vorgenommen werden
im Beispiel haben wir dem Konstruktor gleich Daten für Kontonr. und
Bankleitzahl übergeben
}
FKontoNr := Konto;
FBankleitzahl := BLZ;
end;
...
var Mitarbeiter: TBerufstaetig;
...
Mitarbeiter := TBerufstaetig.Create(12345, 1234567890); //Dies ruft den neuen Konstruktor auf
Wird der Konstruktor (create) nicht an einer Klasse, sondern an einer Instanz aufgerufen, werden dadurch alle Datenfelder des Objekts mit Standardwerten (s. "Einführung in die Objektorientierung") überschrieben.
Eigener Destruktor
Ein eigener Destruktor wird auf ähnliche Art deklariert. Statt des Schlüsselwortes constructor wird das Schlüsselwort destructor verwendet.
Dies ist jedoch nur in wenigen Fällen sinnvoll, z. B. wenn beim Freigeben eines Objekts auch noch weitere Objekte freigegeben werden sollen. Denn wer Speicher reserviert, muss sich auch um dessen Freigabe kümmern.
Weder das Deklarieren von Konstruktoren noch das von Destruktoren ist unbedingt nötig, da jedes Objekt create und destroy von TObject erbt. Allerdings kann damit die Arbeit vereinfacht werden.