![]() |
Delphi-Version: 10.2 Tokyo
(Falsche?) Warnung beim Überladen eines Konstruktors
Hallo,
Habe vereinfacht folgende Situation (Delphi 10.3.0):
Delphi-Quellcode:
Ich verstehe nicht warum da eine Warnung kommt. Ich füge in der Ableitung einfach einen zweiten constructor per overload hinzu.
type
TBasis = class public constructor Create(AOwner: TComponent); virtual; end; TAbleitung = class(TBasis) public constructor Create(AOwner: TComponent; A, B: String); overload; // [dcc32 Warnung] Unit4.pas(24): W1010 Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TBasis' end; Der sollte nichts verbergen und auch wenn ich das teste, kann ich im Code beide constructoren aufrufen (funktioniert auch zur Laufzeit):
Delphi-Quellcode:
Die Codevervollständigung zeigt korrekt beide Überladungen an, beide Überladungen kompilieren und verhalten sich auch zur Laufzeit wie man das erwartet würde.
// Beides compiliert und läuft.
var ableitung: TAbleitung; begin ableitung := TAbleitung.Create(nil); ableitung := TAbleitung.Create(nil, 'A', 'B'); Warum also dann die Warnung? Gibts da irgendwas was ich übersehe oder ist die Warnung an der Stelle (wie ich vermute) einfach falsch? Wenn ich den constructor in TBasis NICHT virtuell mache, dann meckert der Compiler übrigens nicht. |
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
|
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Zitat:
Es geht hier ja explizit darum einen 2. Konstruktor hinzuzufügen (eine Überladung) und nicht den Konstruktor der Basisklasse mit reintroduce zu überdecken. Und das klappt ja auch - nur halt mit einer Warnung die ich nicht nachvollziehen kann. |
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Delphi-Quellcode:
type
TBasis = class public constructor Create(AOwner: TComponent); virtual; end; TAbleitung = class(TBasis) public constructor Create(AOwner: TComponent); overload; override; constructor Create(AOwner: TComponent; A,B: string); reintroduce; overload; end; { TBasis } constructor TBasis.Create(AOwner: TComponent); begin inherited Create; end; { TAbleitung } constructor TAbleitung.Create(AOwner: TComponent); begin inherited; end; constructor TAbleitung.Create(AOwner:TComponent; A,B: string); begin inherited Create(AOwner); end; |
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Dann hab ich für TAbleitung 3 Konstruktoren (2x (AOwner: TComponent)).
Aber so klappt es:
Delphi-Quellcode:
type
TBasis = class public constructor Create(AOwner: TComponent); virtual; end; TAbleitung = class(TBasis) public constructor Create(AOwner: TComponent; A,B: string); reintroduce; overload; end; |
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Zitat:
Ich halte es eh für seltsam dass die Konstruktoren automatisch weitervererbt werden. Das machen andere Sprachen anders (und mMn auch besser). Egal, es läuft ja (irgendwie). |
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Zitat:
|
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Ähm... Wer sagt denn dass ein Constructor unbedingt "Create" heißen muss? Nenn den in der Kindklasse eben "CreateNew", was ja nicht unüblich ist.
Oder alternativ, den Konstruktor der Basisklasse einfach gar nicht erst virtual deklarieren. Die besagte Compilerwarnung hat schon ihre Berechtigung. Denn es hindert dich ja nichts daran, in der Kindklasse einen Konstruktor mit identischer Parameterliste wie in der Elternklasse zu deklarieren. Spätestens dann hättest du ein Scope-Problem. Der scheinbar vererbte Konstruktor wird dir auch nur in der selben Unit in beiden Varianten in der Codevervollständigung angezeigt. In einer anderen Unit erscheint nur der Konstruktor der Kindklasse. Ist wohl die selbe "Baustelle" wie die Tatsache, dass man in der selben Unit auch in Kindklassen auf private-Variablen der Elternklasse zugreifen kann. Besser man gewöhnt sich so einen Schluderladen aus überladenen virtuellen Konstruktoren gar nicht erst an. Denn in der Praxis kann man meistens nur einen davon gebrauchen weil der andere die Kindklasse gar nicht richtig initialisiert. |
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Hat Himitsu schon vor Jahren mal eingetragen und wurde als "Works as expected" geschlossen:
![]() |
AW: (Falsche?) Warnung beim Überladen eines Konstruktors
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Zitat:
Die Compilerwarnung hat NUR DANN eine Berechtigung wenn ich in der Ableitung tatsächlich einen Konstruktor definiere mit den gleichen Parametern wie er schon in der/einer Elternklasse existiert. Das ist aber hier nicht der Fall, daher kein Scope Problem und keinen Grund für die Warnung. Zitat:
Formular: https://www.delphipraxis.net/attachm...1&d=1560500618 Unit4: https://www.delphipraxis.net/attachm...1&d=1560500648 Zitat:
In den meisten Fällen hast du Recht, aber es gibt eben auch Fälle wo der Konstruktor des Kinds nur ein "Bonus" ist und auch der Elternkonstruktor das Objekt ausreichend initialisiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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 by Thomas Breitkreuz