Ich bin verwirrt: warum Aufruf eines Delphi-Konstruktor explizit/als eine normale Methode würde keine neue Instanz erstellen/warum kein Speicherlecks?Delphi-Konstruktor als gewöhnliche Methode aufrufen - irgendwelche versteckten Nebenwirkungen?
Hier ist ein Beispielcode:
TMyHelperClass = class(TObject)
private
fSomeHelperInt: integer;
public
property SomeHelperInt : integer read fSomeHelperInt write fSomeHelperInt;
constructor Create (const initSomeHelperInt : integer);
end;
TMyClass = class(TObject)
private
fHelper : TMyHelperClass;
public
constructor Create(const initSomeInt: integer);
destructor Destroy; override;
property Helper : TMyHelperClass read fHelper;
end;
Umsetzung:
constructor TMyHelperClass.Create(const initSomeHelperInt: integer);
begin
fSomeHelperInt := initSomeHelperInt;
end;
constructor TMyClass.Create(const initSomeInt: integer);
begin
fHelper := TMyHelperClass.Create(initSomeInt);
end;
destructor TMyClass.Destroy;
begin
fHelper.Free;
inherited;
end;
Und Nutzung:
var
my : TMyClass;
begin
my := TMyClass.Create(2016);
try
//WHY is this ok to be used ?
my.Helper.Create(2017);
finally
my.Free;
end;
end;
Wie komme ich erstellen Konstruktor als ein übliches Verfahren der TMyHelperClass + s nennen könnte ? Ich meine - das ist genau so, wie ich es will - aber wie kommt es zu keinen Problemen (mit Gedächtnis)?
Ich denke, die Antwort wird sein, weil die Create-Methode nicht wie TMyHelperClass.Create aufgerufen wurde (um eine Instanz von TMyHelperClass zu erstellen)?
Ist diese Art des Aufrufs des Konstruktors als eine gewöhnliche Methode akzeptabel/ok zu verwenden?
Lesen Sie die Dokumentation. Es wird dort erklärt. Und du willst das nicht tun. Es ist wirklich eine schlechte Übung. Es bricht zusammen, sobald Ihre Klasse eine andere Ressource als ihren eigenen Speicher besitzt. Erstellen Sie eine separate öffentliche Methode, die vom Konstruktor aufgerufen wird. –
Ah :(Hat gelesen, aber offensichtlich nicht sehr geduldig. Hier ist es: – Torpedo
Wenn ein Konstruktor einen Objektverweis (statt einer Klassenreferenz) aufruft, erzeugt er kein Objekt, stattdessen arbeitet der Konstruktor mit dem angegebenen Objekt , führt nur die Anweisungen in der Konstruktorimplementierung aus und gibt dann einen Verweis auf das Objekt – Torpedo