Zitat von
Simon1988:
aber was meinst du mit inherited .. ich mein meine klassen in Delphi sind ja eigentlich nicht voneinander vererbt ..
Da siehst du etwas falsch. In der
OOP (hier sogar mal in ziemlich jeder Sprache) erbt man automatisch von einem gemeinsamen Vorfahren. Häufig ähneln sich hier sogar die Namen dieses Vorfahren, Delphi Klassen erben (immer!) von TObject. Ob du ein direkter oder indirekter Nachfahre bist spielt bei der Vererbung bekanntlich keine Rolle. Die wichtigsten Eigenschaften müssen in einer solchen Basisklasse festgelegt werden, es geht um das einfache Erzeugen einer Instanz. Dazu muss letztlich Speicher alloziert und gefüllt werden. Darum kümmert sich (zum Glück) der Urkonstruktor überhaupt, TObject.Create. Da jede Klasse ein Nachfahre ist, sollte auch tunlichst jede Klasse einmal diesen Konstruktor aufrufen. Da du hier zwei Klassen einführst und verwendest, gilt das auch für dich.
Statt
kannst du auch schreiben
Delphi-Quellcode:
TXYZ = class(TObject)
...
end;
Beide Blöcke haben die gleiche Aussage! Führst du einen eigenen Konstruktor ein, so musst du immer als erstes dafür sorgen, dass Speicher alloziert wird, die Adresse bekannt gegeben, etc. Irgendwoher muss Delphi ja dann wissen, wo jetzt dein Objekt liegt, welchen Typ es hat usw. Davon übernimmt der Vererbte Konstruktor von TObject schon einen guten Teil. Deswegen beginnt jeder Konstruktor immer mit der Zeile:
[delphi]
constructor TXYZ.create;
begin
inherited create;
end;
[delphi]
Also so sieht es bei direkten Erben von TObjekt aus, bei einem TControl würdest du natürlich dem inherited create noch den Owner mitgeben, aber der würde damit nur die geerbte Methode von TComponent aufrufen, dass geht dann wieder runter bis zum Parameterlosen create Aufruf eines TObject.
Ähnlich sieht es dann beim Destruktor auf. Der muss ja letztlich sauber machen. Jetzt kannst du dich selbst drum kümmern, wie Delphi seine Klassen verwaltet (was keineswegs sinnvoll ist) oder du greifst hier dann einfach auf den geerbten Destruktor zurück. Überschreibst du also einen Destruktor, so muss die letzte Zeile inherited destroy heißen (die gibt einfach den Speicher des Objekts und aller Variablen, etc. frei).