![]() |
Destruktor ueberschreiben - Warnung
Hallo allerseits,
ich versuche in einer von TObject abgeleiteten Klasse den Destruktor zu ueberschreiben, um einen Parameter hinzuzufuegen (fragt nicht warum, ich will es so, weil es komfortabel waere ;))
Delphi-Quellcode:
Nun schimpft der Compiler aber rum, dass mein Destroy die Methode der Basisklasse ueberschreibt ("Method 'Destroy' hides virtual method of base type 'TObject'). Ich weiss es ist nur eine Warnung, aber mich interessiert, wie ich das umgehen kann. Welches Schluesselwort muss ich anstatt overload verwenden?
TProgramOptions = class(TObject)
private //... public constructor Create(LoadFile: Boolean=False); procedure Free(SaveFile: Boolean=False); overload; destructor Destroy(SaveFile: Boolean=False); overload; //... end; //type TProgramOptions = class(TObject) Greetz alcaeus |
Re: Destruktor ueberschreiben - Warnung
Gab es da nicht sowas wie
Delphi-Quellcode:
:?:
override;
MfG Binärbaum |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Greetz alcaeus |
Re: Destruktor ueberschreiben - Warnung
:warn: Man sollte (darf) für den Destructor die Parameterliste nicht ändern. Das führt nur zu unnötigen AVs! :warn: ...:cat:... |
Re: Destruktor ueberschreiben - Warnung
![]() |
Re: Destruktor ueberschreiben - Warnung
Zitat:
|
Re: Destruktor ueberschreiben - Warnung
Zitat:
Allerdings wuerde mich jetzt interessieren warum es die AVs gibt ;) Greetz alcaeus |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Zitat:
...:cat:... |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Greetz alcaeus |
Re: Destruktor ueberschreiben - Warnung
Zitat:
...:cat:... |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Greetz alcaeus |
Re: Destruktor ueberschreiben - Warnung
Ein Destruktor darf grundsätzlich keine Parameter haben!!
(mit Ausnahme des versteckten Self-Parameters) Dies gilt nicht nur für Delphi sondern auch für andere Programmiersprachen wie C++ u.s.w. Bei Delphi ist der Destruktor von Anfang an virtuell und das ist auch gut so. Wenn ein Objekt zerstört werden soll, gibt es nur 2 Informationen: * das Objekt (bzw. der Zeiger auf das Objekt) * es soll zerstört werden und alle verwendete Resourcen (insb. Speicher) freigegeben werden Du diesem Zeitpunkt ist sehr häufig nicht einmal die genaue Klasse bekannt. Vereinfacht ist die Aufrufereihenfolge so: TObject.Free -> TEdit.Destroy -> TWinControl.Destroy -> TControl.Destroy -> TPersistent.Destroy -> TObject->Destroy Die Methode Free ruft intern Destroy auf:
Delphi-Quellcode:
Man sieht also, dass Destroy nur dann aufgerufen wird, wenn Self auf ein Objekt verweist.
procedure TObject.Free;
asm TEST EAX,EAX JE @@exit MOV ECX,[EAX] MOV DL,1 CALL dword ptr [ECX].vmtDestroy @@exit: end; // und jetzt mal übersetzt nach Pascal procedure TObject.Free; if Assigned(self) then self.Destroy; end; Die Methode Free ist nicht virtuell und darf auch niemals verändert oder überschrieben werden ! weitere Info's: ![]() |
Re: Destruktor ueberschreiben - Warnung
Zitat:
borland Use reintroduce when you want to hide an inherited virtual method with a new one. Ich glaube nicht, dass das hier gewollt ist. Die Sprachdefinition von Delphi (was Object Pascal) lässt ja mehrere Destruktoren zu, Borland rät aber davon ab, dieses feature zu benutzen. Sein Vorhandensein erhöht nicht die Mächtigkeit der Sprache. Alles, was ein Destruktor zu tun hat, weiss er - auch ohne Parameter. Über Parameter gesteuerte Aktionen im Destruktor gehören aus puristischer Sicht in eine andere Methode. Es gibt aber keine einheitliche Bestrafung für Verstösse. Grüße vom marabu @shmia: ein Destruktor darf Parameter haben - es muss nur bedacht werden, dass grundsätzlich die register calling convention gilt. Probier es aus - oder lese im Handbuch. |
Re: Destruktor ueberschreiben - Warnung
Problem geloest:
Delphi-Quellcode:
Der Compiler motzt nicht, und sobald das Ganze testfaehig ist, werd ich sehn ob ich Besuch von einer huebschen AV bekomme ;)
procedure Free; overload;
procedure Free(SaveFile: Boolean); overload; //.. procedure TProgramOptions.Free; begin Free(False); end; //procedure TProgramOptions.Free; procedure TProgramOptions.Free(SaveFile: Boolean); begin if SaveFile then begin //... end; //if SaveFile then if Self <> nil then Destroy; end; //procedure TProgramOptions.Free(SaveFile: Boolean); Greetz alcaeus |
Re: Destruktor ueberschreiben - Warnung
Was soll das denn werden?
Self <> nil ? :mrgreen: wie kann Self nil sein, wenn du doch auf Felder von der Instanz zugreifst bzw. in einer ihrer Methoden bist? |
Re: Destruktor ueberschreiben - Warnung
guck mal in TObject.Free ;)
Delphi-Quellcode:
self kann Nil sein. Self ist (IMHO) ein versteckter parameter, der die Adresse der Instanz übergibt
procedure TObject.Free;
begin if Self <> nil then Destroy; end; (bitte nich schlagen wenns falsch is :duck: ) |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Delphi-Quellcode:
Was sonst, ausser NIL sollte für Self da übergeben werden ;-) Wird es auch, kannst Du gerne mal testen. Theoretisch kannst Du in jeder Methode Self auf nil überprüfen...
var
Button: TButton; begin Button := nil; Button.Free; end; ...:cat:... |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Richtig wäre doch, ein Property AutoSave:Boolean einzuführen und dann
Delphi-Quellcode:
procedure TProgramOptions.Destroy;
begin if FAutoSave then SaveToFile; ... inherited; end; |
Re: Destruktor ueberschreiben - Warnung
Zitat:
...:cat:... |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Zitat:
...:cat:... |
Re: Destruktor ueberschreiben - Warnung
--- selbsterlediger, da verpennt ---
|
Re: Destruktor ueberschreiben - Warnung
![]() Greetz alcaeus |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Sorry, aber ich überschreibe nur Destruktoren, mir ist bisher noch nie sowas perverses, wie das hier besprochene, eingefallen. :oops: |
Re: Destruktor ueberschreiben - Warnung
Zitat:
Ich hab aber die Property implementiert, ist ja egal wie ich es mache solange es funktioniert ;) Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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 by Thomas Breitkreuz