![]() |
Re: DynArray: array of TShape
Moin Char,
der eigentliche destructor heisst i.d.R. Destroy. Free führt noch Prüfungen durch, bevor es dann Destroy aufruft. Die eigentliche Freigabe findet also in Destroy statt, das von Free aufgerufen wird. Nennen kannst Du den natürlich wie Du willst, aber Free ist von seinem Sinn her vorbelegt, so dass es zumindest ungeschickt wäre den destructor so zu nennen. Zudem ist es Konvention einen destructor Destroy zu nennen (genauso wie der constructor üblicher Weise Create heisst.) inherited heisst, dass die Methode gleichen Namens von der Basisklasse Deiner Klasse an dieser Stelle aufgerufen wird. Gibst Du hier noch einen Namen mit (z.B. inherited MethodenName) so wird die Methode "MethodenName" der Basisklasse aufgerufen. Ggf. sind dann noch Parameter zu übergeben. Stimmt Deine Deklaration mit der der Basisklasse überein kannst Du den Namen und die Parameter weglassen, da diese automatisch übernommen werden. BTW: Ich hab' hier auch Blödsinn geschrieben: :oops: "Das inherited ist zwar bei Ableitung von TObject nicht zwingend erforderlich, da es hier nichts zu erben gibt, " Man ruft ja den Destructor von TObject auf, und das sollte auch so sein. Jetzt musst Du nur noch darauf achten, an welcher Stelle das inherited gesetzt wird. Bei einem constructor sollte inherited als erstes aufgerufen werden, da es ja sinnvoll ist alles was von vorherigen Klassen stammt zu initialisieren, bevor man seine eigenen Ergänzungen initialisiert. Aus dem gleichen Grunde gehört inherited beim Destructor ans Ende. Erst einmal die eigenen Sachen aufräumen, dann dass was aus vorhergehenden Klassen stammt. Bei anderen Methoden die man überschreibt hängt es vom Zusammenhang ab, an welcher Stelle man das inherited einfügt. Meistens wohl als erstes, im Extremfall vielleicht auch gar nicht. Zitat:
|
Re: DynArray: array of TShape
Also muss in meinen Constructor auch inherited ja?
Wieso funktioniert es denn dann auch ohne? TSCtrl ist ja eine Ableitung von TObject, wieso wird das Objekt ordnungsgemäß erstellt, wenn gar nicht die Create-Prozedur von TObject aufgerufen wird, sondern "nur" meine? Und: Wieso geht inherited Free nicht? Free überprüft doch nur, ob das Objekt nicht vorher nil ist, weil Destroy alleine da nen Fehler ausgibt oder? Fragen über Fragen... [edit] Wenn ich inherited in den Constructor schreibe kommt folgende Fehlermeldung: [Fehler] USCtrl.pas(34): Inkompatible Typen Und wenn ich den Destructor umschreibe kommt eine Warnung: [Warnung] USCtrl.pas(22): Methode 'Destroy' verbirgt virtuelle Methode vom Basistyp 'TObject' Was ist überhaupt eine virtuelle Methode (virtual)? [/edit] |
Re: DynArray: array of TShape
Moin Char,
wenn Du es so schreibst
Delphi-Quellcode:
sollte es gehen.
type
TcsMyType = class(TObject) public constructor Create(const AsIrgendeinParameter : string); destructor Destroy; override; end; implementation { TcsMyType } constructor TcsMyType.Create(const AsIrgendeinParameter: string); begin inherited Create; // ... end; destructor TcsMyType.Destroy; begin //... inherited; end; Beim inherited im constructor musst Du den Aufruf der Basisklasse so mitgeben, wie er in der Basisklasse deklariert ist, wenn Deine Deklaration davon abweicht. Es wird vermutlich ohne inherited gehen, wenn in TObject.Create nichts initialisiert wird. Zum Thema virtuelle Methoden kannst Du ja erst einmal in der Hilfe unter eben diesem Begriff nachschlagen. Ich finde, dass ist da ganz gut erklärt. GGf. wäre es dann vielleicht sinnvoll mal einen neuen Thread aufzumachen, denn irgendwie sind wir hier, bezogen, auf Deine Eingangsfrage, schon lange OT ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz