Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konstruktor Create Virtual oder nicht? (https://www.delphipraxis.net/98594-konstruktor-create-virtual-oder-nicht.html)

MatthiasR 23. Sep 2008 08:04

Re: Konstruktor Create Virtual oder nicht?
 
Da meine Frage grob in die gleiche Richtung geht und ich nicht extra für so etwas banales nen neuen Thread aufmachen will, häng ich mich einfach mal hinten dran.

Ich möchte lediglich wissen: wenn ich eine eigene Klasse von TObject ableite mit einem eigenen Konstruktor und Destruktor, muss ich dann zu Beginn des Konstruktors erstmal inherited aufrufen, genauso wie am Ende des Destruktors? Also quasi so:
Delphi-Quellcode:
interface

  TMyClass = class(TObject)
  private
    FBlaBlubb: TBlaBlubb;
  public
    constructor Create;
    destructor Destroy; override;
    property BlaBlubb: TBlaBlubb read FBlaBlubb write FBlaBlubb;
  end;

implementation

{ TMyClass }

constructor TMyClass.Create;
begin
  inherited;

  FBlaBlubb := nil;
end;

destructor TMyClass.Destroy;
begin
  FBlaBlubb.Free;

  inherited;
end;
Oder sind beide inherited-Aufrufe unnötig oder gar falsch? Oder nur einer von beiden?!?

Roachford 23. Sep 2008 08:46

Re: Konstruktor Create Virtual oder nicht?
 
Da die Destruktoren und Konstruktoren in TObject leer sind, benötigst du es nicht unbedingt. Aber damit hast du auch wieder einen möglichen Fehler geschaffen: Wenn du später mal zwischen TObject und deiner Klasse eine weitere Basisklasse dazwischenschiebst, dann werden deren Konstruktoren- und Destruktorenanweisungen nicht ausgeführt. Und das suchste denn ein paar Wochen nach der Deklaration der ersten Klasse vergeblich, warum das nicht klappt.

Der Speicher für die Instanz wird eh vor dem Konstruktoraufruf alloziiert, somit brauchst du nicht zu fürchten, dass die Instanz nicht komplett ist ohne den inherited Aufruf.

Im Endeffekt bist du mit dem inherited Aufruf auf der sicheren Seite.

BTW: Deine Initialisierung im Konstruktor ist nicht zwingend notwendig, da Member automatisch mit dem Ordinalwert 0 initialisiert werden, also nil, false, 0.0, 0, #0 und '' (wobei Strings eine kleine Ausnahme bilden).

MatthiasR 23. Sep 2008 14:41

Re: Konstruktor Create Virtual oder nicht?
 
Zitat:

Zitat von Roachford
Der Speicher für die Instanz wird eh vor dem Konstruktoraufruf alloziiert, somit brauchst du nicht zu fürchten, dass die Instanz nicht komplett ist ohne den inherited Aufruf.

Danke, dass du das nochmal explizit geschrieben hast, da war ich mir nämlich nicht so ganz sicher, wie sich das verhält.
Zitat:

Zitat von Roachford
Im Endeffekt bist du mit dem inherited Aufruf auf der sicheren Seite.

Alles klar, dann werde ich das doch so beibehalten :)

Vielen Dank für deine Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz