Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

AW: Konstruktoren in Delphi

  Alt 21. Sep 2020, 17:30
Jupp, beim DESTRUCTOR immer das OVERRIDE.

Teilweise auch beim CONSTRUCTOR.
* siehe TComponent, wenn die Komponente zur DesignTime auf die Form soll, denn der DFM-Loader kennt nur "sein" Create.

* Es gibt zwar einen leeren Standard-Constructor in TObject, aber der muss nicht aufgerufen werden. (besser ist es aber, wenn er wird)
* * denn aktuell ist der eh leer
* * VOR dem Create (oder wie auch immer man das nennen mag) wird bei einem "CONSTRUCTOR" immer erstmal die Speicherinitialisierung durchgeführt, also vor dem Inhalt dies Create

INHERITED einach immer.
* wenn es nicht nötig ist, weil es nichts im Vorfahren gibt, dann ignoriert es der Compiler
* ansonsten ruft es die "gleichnamige" Methode mit den "gleichen" Parametern im Vorfahren auf (bzw. die Methode mit dem Namen den man angibt)

Am Einfachsten/Sinnvollsten ist es das INHERITED bei "erstellenden" Methoden (Create/Get/...) als Erstes auszuführen
und bei löschenden/freigebenden Methoden (Destroy/Delete/...) als Letztes. (Ausnahmen gibt es, aber meistens ist es so am Besten)

Im Delphi gibt es immer per Standard ein "leeres" Create.
* Wenn man nichts initialisieren will, dann braucht man also keinen Eigenen
* genauso beim DESCRUCTOR (hier gibt es im Delphi nur den "Destroy", welcher automatisch aufgerufen wird)
* * hat man nichts freizugeben, oder alles wird automatisch freigegeben (z.B. String, dyn. Array, Interface oder Variant), dann braucht man hier auch keinen eigenen DESTRUCTOR



Im Free/FreeAndNil ist bereits ein "if Assigned" eingebaut, also nochmal ist nicht nötig. (doppelt ist nicht falsch, nur unnötig)

Delphi-Quellcode:
type
  TMail = class(TComponent)
  ...

constructor TMail.Create(param1, param2 : String);
begin
  inherited Create(nil); // NIL: oder du baust den Owner auch in dein Create mit ein
  smtp := TIdSMTP.Create(Self);
  sslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
end;
Hier wird automatisch Speicherverwaltet, daher ist für diese beiden Felder/Variablen kein Destructor nötig.

Das Inherite bei diesem Creaate(nil) ist nicht unbedingt nötig.
* mit inherited wird immer das Create(mit TComponent) im Vorfahren aufgerufen
* ohne inherited in deiner Klasse (sollte es dort so ein Create geben), ansonsten im Vorfahren
$2B or not $2B

Geändert von himitsu (21. Sep 2020 um 18:35 Uhr)
  Mit Zitat antworten Zitat