![]() |
Re: unsichtbare Klassen
gleiches gilt neben dem Aufruf von xxx.Free; auch für die Verwendung/Aufruf von FreeAndNil(xxx);
|
Re: unsichtbare Klassen
Vorab : der Thread hier wurde vom Fragesteller woanders mittlerweile als OT gebrandmarkt. :mrgreen:
Nichtsdestotrotz : das ganze sieht doch so aus :
Delphi-Quellcode:
Wie Muetze richtig aus der Hilfe zitiert hat, ist es dasselbe einfach "class" zu schreiben oder eben "class (TObject)". Also ist das ein Nachfahre von TObject. Aber nur pro forma. Warum soll jetzt da nochmals ein leerer Destructor per override auch noch überschrieben werden ? :shock: Vermute sogar, dass der Delphi-Linker das automatisch entfernt. Naheliegend wäre auch, das die vereinfachte Schreibweise Class erlaubt wird, damit keiner auf die Idee kommt, so was überflüssigerweise zu machen. :-D
destructor TObject.Destroy;
begin end; |
Re: unsichtbare Klassen
Zitat:
Du hast eine beliebige Klasse, bspw. TMeineKlasse. Im Konstruktor dieser Klasse wird bspw. Speicher allociert, oder irgendetwas instanziert, das im Destruktor wieder freigegeben werden muss. Nun gibts 2 Moeglichkeiten:
Delphi-Quellcode:
Du behauptest, zweiteres mache keinen Sinn. Analysieren wir mal, was die unterschiede sind:
//1.
destructor Destroy(); //2. destructor Destroy(); override; Wenn eine Variable als TMeineKlasse deklariert ist, macht es keinen Unterschied. Wenn aber eine Variable nicht als TMeineKlasse, sondern als Vorfahre (bspw. TObject) deklariert ist, aber als TMeineKlasse instanziert wurde, muss auch der Destruktor von TMeineKlasse aufgerufen werden. Passiert das aber? Nein.
Delphi-Quellcode:
Gibt ein schoenes Speicherleck. mit dem ueberschreiben des Destruktors passiert das nicht.
TMeineKlasse = class
constructor Create(); destructor Destroy(); speicher: Pointer; end; //... constructor TMeineKlasse.Create(); begin speicher = allocmem(100); end; destructor TMeineKlasse.Create(); begin freemem(speicher); end; procedure ProbiersAus(); var x: TObject; begin x := TMeineKlasse.Create(); x.Free(); //Es wird TObject.Free aufgerufen! end; greetz Mike |
Re: unsichtbare Klassen
Zitat:
Den Aufruf von Inherited würde ich aber auch nicht weglassen, da sonst bei einer Änderung des Inhalts des Destructors in TObject seitens Borlands nicht Rechnung getragen würde. /EDIT: roter Rahmen verzweifelt gesucht... |
Re: unsichtbare Klassen
Zitat:
Zitat:
|
Re: unsichtbare Klassen
@JasonDX
Zitat:
Delphi-Quellcode:
Dieser "Umweg" über das Free, welches nur im Urahnen TObject existiert, macht beim Aufruf des Destructors den kleinen Unterschied.
var
x: TMeineKlasse; |
Re: unsichtbare Klassen
Ich liebe Grundsatzdiskussionen, aber wir sind anscheinend noch lange nicht fertig. :mrgreen:
Erkläre mir mal bitte einer, was ich in diesem Fall mit dem overrride soll :
Delphi-Quellcode:
Das Programm zeigt 2-mal '123' an, wie erwartet. Geht man dann noch hin und macht das IMHO überflüssige Destroy und alles was damit zusammenhängt weg, dann tut es das auch.
Unit Unit2;
interface implementation uses Dialogs, SysUtils; type TMeineKlasse = class private i : integer; protected constructor Create; destructor Destroy; end; var MeineKlasse : TMeineKlasse; constructor TMeineKlasse.Create; begin i := 123; end; destructor TMeineKlasse.Destroy; begin showmessage ('Destroy '+IntToStr (i)); end; begin MeineKlasse := TMeineKlasse.Create; showmessage (IntToStr (MeineKlasse.i)); MeineKlasse.Destroy; end. Wer hat ein Gegenbeispiel ? Es darf aber wirklich nur als Class deklariert sein. Das TObject-Free von Jason ist auch gemogelt, es geht um Destroy. Free hat eingebaute Funktionalität. Das ist schon was anderes. |
Re: unsichtbare Klassen
Moin Hansa,
das ist ungefähr das, was JasonDX meinte. Der direkte Aufruf von Destroy in deinem Beispiel verhält sich so, wie du sagst. Was anderes hatte JasonDX auch nicht behauptet. Jetzt gibt es aber Fälle, wo (jetzt bezogen auf dein Beispiel) nicht
Delphi-Quellcode:
sondern
var MeineKlasse : TMeineKlasse;
Delphi-Quellcode:
gesetzt wird, und dennoch wie folgt created wird:
var MeineKlasse : TObject;
Delphi-Quellcode:
Jetzt erreicht dein Code den Destructor von TMeineKlasse nicht mehr.
MeineKlasse := TMeineKlasse.Create;
Zitat:
Wer ruft denn bitteschön Destroy direkt auf? Für dein Beispiel war es jetzt ja ganz gut und schön und anschaulich. Aber in der Praxis sollte und wird die Methode Free oder die Procedure FreeAndNil() benutzt. Und genau dann ist override in jedem Fall erforderlich. |
Re: unsichtbare Klassen
Zitat:
Delphi-Quellcode:
Kein Destroy mehr, auch kein override und es geht immer noch. Ich will lediglich wissen, was einige hier vorhaben mit override etc. Und sieh mal einer an, was steht denn da :
Unit Unit2;
interface implementation uses Dialogs, SysUtils; type TMeineKlasse = class private i : integer; constructor Create; end; var MeineKlasse : TMeineKlasse; constructor TMeineKlasse.Create; begin i := 123; end; begin MeineKlasse := TMeineKlasse.Create; showmessage (IntToStr (MeineKlasse.i)); end.
Delphi-Quellcode:
:shock: Da ist ja sogar das Create eventuell fällig. :mrgreen:
constructor TObject.Create;
begin end; Edit : es sei angemerkt, dass nicht mal inherited verwendet wird ! Normalerweise wäre das schon nötig. |
Re: unsichtbare Klassen
Zitat:
Du willst wissen, wie es sich mit virtuellen Methoden und override verhält? Fein. Steht hier in diesem Thread jetzt doppelt und dreifach. Lies in. ;-) In der Hilfe steht das ebenfalls recht ansprechend beschrieben. Die Geschichte mit Free ist zudem ein sehr schönes Beispiel für die Implemetierung in einer Klassenhierarchie. Kann man herrlich ausprobieren und (auch wenn's schwer ist) verstehen. Tue es, oder lass es. Ich habe keinen Bock, dir zu erklären, dass das Gras grün ist. Wenn du jede Klasse ausschließlich so instantiierst wie sie deklariert ist und wenn du eigenen Klassen immer einen statischen Destruktor verpasst und diesen immer direkt mit xxx.Destroy aufrufst, dann wirst du möglicherweise immer zurecht kommen. Oder um auf das Gras zurückzukommen: Wenn du dein ganzen Grundstück zupflasterst, ist das in Ordnung. Die Rasenflächen der Anderen sind aber immer noch grün - ganz egal, ob du das akzeptierst oder nicht. :spin2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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