AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Konstruktoren in Delphi

Ein Thema von Int3g3r · begonnen am 18. Sep 2019 · letzter Beitrag vom 22. Sep 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Konstruktoren in Delphi

  Alt 21. Sep 2020, 16: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
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Konstruktoren in Delphi

  Alt 22. Sep 2020, 11:14
Danke für die weiteren Antworten.

Zitat:
Setze einfach inmmer ein inherited; Jede Klasse erbt..
Also wenn ich TMail = Class schreibe erbt diese automatisch von TObject ?

Zitat:
Im Free/FreeAndNil ist bereits ein "if Assigned" eingebaut, also nochmal ist nicht nötig. (doppelt ist nicht falsch, nur unnötig)
Danke für den Hinweis das wusste ich nicht.

Nun habe ich noch eine weitere Frage.
Wie lässt sich der Owner in meinem Beispiel einbauen, bzw macht dies überhaupt Sinn ?
Delphi-Quellcode:
constructor TMail.Create(AOwner: TComponent, param1, param2 : String);
begin
  inherited Create;
  smtp := TIdSMTP.Create(nil);
  sslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
end;
Ich kann bei inherited Create; keinen Owner angeben da meine Klasse von TObject erbt.
Das Create von TObject will keine Parameter.
Bzw was soll ich danach mit dem Owner anstellen wenn ich diesen im TMail.Create übergebe ?

Gruss Int3g3r.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#3

AW: Konstruktoren in Delphi

  Alt 22. Sep 2020, 12:02
Also wenn ich TMail = Class schreibe erbt diese automatisch von TObject ?
So ist es. TObject ist in der Klassenhierarchie ganz oben, sozusagen der Urvater aller Objekte.

TMail = Class ist dasselbe wie TMail = Class(TObject) .

Zitat:
Wie lässt sich der Owner in meinem Beispiel einbauen, bzw macht dies überhaupt Sinn ?
Delphi-Quellcode:
constructor TMail.Create(AOwner: TComponent, param1, param2 : String);
begin
  inherited Create;
  smtp := TIdSMTP.Create(nil);
  sslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
end;
Ich kann bei inherited Create; keinen Owner angeben da meine Klasse von TObject erbt.
Das Create von TObject will keine Parameter.
Bzw was soll ich danach mit dem Owner anstellen wenn ich diesen im TMail.Create übergebe ?
Einen Owner gibt es erst bei TComponent. Entweder leitest du davon ab, oder du musst den Owner-Parameter weglassen. Kommt darauf an, was deine Klasse tun soll.

Grüße
Dalai
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 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