Einzelnen Beitrag anzeigen

Bodenseematze

Registriert seit: 10. Jul 2023
50 Beiträge
 
#12

AW: Verweis auf Interface-Instanz weitergeben - ist das erlaubt?

  Alt 1. Mär 2024, 13:42
Zitat:
und ich kann doch den Standard "Create"-Konstruktor nicht als virtuell überschreiben / neu schreiben, da dieser nicht virtuell ist - oder geht das irgendwie?
Warum nicht?
Du hast natürlich wieder mal Recht.
Keine Ahnung mehr, warum ich das in meinem Projekt umbenannt hatte.
Irgendwas ging nicht - war's vielleicht das mit dem "overload", was nicht ging ?
Jetzt weiß ich wieder, was nicht ging bzw. was das Problem mit den Konstruktoren mit Namen "Create" ist.
Ich wollte jetzt im tatsächlichen Projekt die Konstruktoren mit anderem Namen alle auf "Create" zurück ändern.
Nachdem ich das gemacht habe, war das erste Ergebnis in der BaseForm-Klasse so:
Delphi-Quellcode:
constructor Create( compOwner_ : TComponent;
                    const posInitial_ : TMyPos;
                    bIsFormSingleton_ : Boolean;
                    iScalePercentage_ : Integer = -1 ); overload; virtual;
constructor Create( compOwner_ : TComponent;
                    bIsFormSingleton_ : Boolean;
                    iScalePercentage_ : Integer = -1 ); overload; virtual;
constructor Create( compOwner_ : TComponent;
                    iScalePercentage_ : Integer ); overload; virtual;

// aus TCustomForm:
constructor Create( compOwner_ : TComponent ); overload; override;
Das lässt sich so nicht übersetzen - hier meckert der Compiler, bei den ersten drei Konstruktoren
(also die mit zusätzlichen Parametern, die es in den Basisklassen gar nicht gibt):
Code:
Method 'Create' hides virtual method of base type 'TCustomForm'


Also muss ich das so machen:
Delphi-Quellcode:
constructor Create( compOwner_ : TComponent;
                    const posInitial_ : TMyPos;
                    bIsFormSingleton_ : Boolean;
                    iScalePercentage_ : Integer = -1 ); reintroduce; overload; virtual;
constructor Create( compOwner_ : TComponent;
                    bIsFormSingleton_ : Boolean;
                    iScalePercentage_ : Integer = -1 ); reintroduce; overload; virtual;
constructor Create( compOwner_ : TComponent;
                    iScalePercentage_ : Integer ); reintroduce; overload; virtual;

// aus TCustomForm:
constructor Create( compOwner_ : TComponent ); overload; override;
Und dann habe ich in der BaseFormMain (abgeleitet von BaseForm) als einzigen Konstruktor folgendes definiert:
Delphi-Quellcode:
constructor Create( compOwner_ : TComponent;
                    const posInitial_ : TMyPos;
                    bIsFormSingleton_ : Boolean;
                    iScalePercentage_ : Integer = -1 ); override;
Im BaseFormMain-Konstruktor steht dann am Anfang:
inherited; Das ruft auch (richtigerweise) den Konstruktor mit vier Parametern in BaseForm auf.

Die BaseForm-Konstruktoren mit weniger Parametern rufen alle den Konstruktor mit vier Parametern auf;
in diesem steht dann noch:
inherited Create( compOwner_ ); Gedacht ist, dass er den Konstruktor in TCustomForm aufruft.
Macht er aber nicht - stattdessen wird (erneut) der Konstruktor in BaseFormMain aufgerufen.

Also ein prima Endlos-Rekursionsschleife gebastelt

Nur ist mir nicht klar, warum das passiert...
...und wie ich ihn dazu bringen könnte, mit dem o.a. inherited den korrekten Konstruktor in TCustomForm aufzurufen
(ohne die Konstruktoren wieder alle umzubenennen)...

EDIT: Hier noch der vollständige Stack-Aufruf:
Durch Application.CreateForm mit der Implementierung der MainForm (abgeleitet von BaseFormMain) wird folgendes aufgerufen:
  1. in der Klasse BaseForm der überschriebene Konstruktor mit einem Parameter;
  2. der wiederum ruft direkt den Konstruktor mit vier Parametern auf --> hier wird der überschriebene Konstruktor in der MainForm-Instanz aufgerufen,
  3. der wiederum über inherited den (einzigen) Konstruktor mit vier Parametern in BaseFormMain aufruft,
  4. der wiederum über inherited den Konstruktor mit vier Parametern in BaseForm aufruft;
  5. und der ruft dann über inherited wieder seinen (!) Konstruktor mit einem Parameter auf...
  6. ...usw. (jetzt geht's wieder bei 1 los)
Die Frage ist also immer noch: warum wird trotz "inherited"-Aufruf der eigene Konstruktor aufgerufen?

Geändert von Bodenseematze ( 1. Mär 2024 um 14:17 Uhr)
  Mit Zitat antworten Zitat