![]() |
Re: Overload und Override für Constructor
Manchmal braucht man doch einen andersnamigen Konstruktor.
Delphi-Quellcode:
Create wirft immer eine Exception. Nur CtlCreate funktioniert.
TJvHidDeviceReadThread = class(TThread)
private ... constructor CtlCreate(const Dev: TJvHidDevice); public ... constructor Create(CreateSuspended: Boolean); end; TJvHidDeviceReadThread muss in der interface section stehen, aber trotzdem kann ausserhalb der Unit kein Objekt davon erstellt werden. |
Re: Overload und Override für Constructor
Schön, solch angeregte Diskussion auszulösen :zwinker:
Ich hab mein Problem jedenfalls mit 2 überladenden Konstruktoren gelöst und es funzt. Danke nochmal :dp: |
Re: Overload und Override für Constructor
Zitat:
|
Re: Overload und Override für Constructor
Zitat:
|
Re: Overload und Override für Constructor
Zitat:
Bei einem Konstruktor ist so ein Verhalten eigentlich unnötig. Ein Konstruktoraufruf sieht in Pascal üblicherweise so aus:
Delphi-Quellcode:
Der Datentyp wird also explizit angegeben, es besteht nicht die geringste Frage, welcher Konstruktor aufgerufen werden soll, es muss der von TSomeType sein. Ein Aufruf, bei dem die Laufzeitinformation nötig wäre, wäre SomeVar.Create(Params), der aber keinen Sinn ergibt, da SomeVar entweder noch nicht instanziert war (dann kann es je nach Implementierung des Konstruktor gewaltig knallen, wie wir alle wissen), oder schon ein Objekt besaß, daß aber auch nach dem Aufruf noch in SomeVar bleibt. Es würde alleine der Konstruktor nochmal abgearbeitet werden (mit möglichen Initialisierngsfunktionen. Da ich kein Delphi zur Hand habe, kann ich nicht sagen, ob die üblichen Eigenschaften des Konstruktors auch bei bereits instanzierten Objekten gelten. Falls ja, wird unmittelbar vor dem Aufruf Speicher für eine neue Instanz des Objektes erzeugt und dieser als Rückgabewert zurückgegeben (das ist, was passiert, wenn man SomeVar := TSomeType.Create(Params); aufruft), der aber nirgends wieder referenziert wird. Wieder mangels vorhandenem Delphi bin ich mir nicht sicher, auf welches Objekt self zeigt, wenn man SomeVar.Create aufruft. Zeigt es auf SomeVar (und nicht auf das neu instanzierte Objekt), wäre der u.U. zurückgegebene, nicht referenzierte Speicher auch noch uninitialisiert, selbst wenn ich das Ergebnis also abfangen würde, wäre mein Objekt in einem unerwüsnchten Zustand.
SomeVar := TSomeType.Create(Params);
Mir fällt keine Gelegenheit ein, bei der ein virtueller Konstruktor einen praktischen Sinn haben würde, denn von bereits instanzierten Objekten rufe ich keine Konstruktoren auf. Robert meinte, daß ab TComponent der Konstruktor virtual ist, die einzige Erklärung, die ich dafür finde, ist, daß die IDE mit den Komponenten irgendwelche perversen Dinge anstellt, von denen ich lieber nicht wissen möchte, was es ist. |
Re: Overload und Override für Constructor
@tommie-lie: Was ist mit Metaklassen? Da macht folgendes Konstrukt Sinn:
Delphi-Quellcode:
Möglicherweise muss in so einem Fall der Konstruktur virtuell sein. Mit Betonung auf möglicherweise, denn ich hab diese Metaklassen nie eingesetzt.
type
TBlubb = class; TSpinatBlubb = class(TBlubb); TBlubbClass = class of TBlubb; var bc: TBlubbClass; b: TBlubb; begin bc := TSpinatBlubb; b := bc.Create; end; |
Re: Overload und Override für Constructor
Zitat:
|
Re: Overload und Override für Constructor
Zitat:
@Flocke: Genau soetwas meinte ich mit perversen Dingen ;-) |
Re: Overload und Override für Constructor
MetaClasses, und damit virtuelle class methods/properties[1] und Konstruktoren sind doch was feines. ;)
Aber umbenannte Konstruktoren finde ich sogar noch furchtbarer als Benannte im allgemeinen... :? [1]OK, in Delphi sind properties nicht virtuell... |
Re: Overload und Override für Constructor
Wo ist das Problem mit "umbenannten" Konstruktoren? So lange man sich an die Konventionen hält, so dass jeder Konstruktor das Wort "Create" enthält, sollte eigentlich jedem halbwegs durchschnittlich begabten Mitteleuropäer klar sein, dass es sich hierbei um den Konstruktor handelt. Noch dazu, weil man's ja zusätzlich an der Syntax erkennen kann.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 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