Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Verweis auf Interface-Instanz weitergeben - ist das erlaubt? (https://www.delphipraxis.net/214721-verweis-auf-interface-instanz-weitergeben-ist-das-erlaubt.html)

Bodenseematze 27. Feb 2024 16:28

AW: Verweis auf Interface-Instanz weitergeben - ist das erlaubt?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1533941)
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 :??

Im Testprojekt geht es auf jeden Fall problemlos so:
Delphi-Quellcode:
constructor Create( owner_ : TComponent ); virtual;


EDIT:
und mit überladenen Konstruktor geht's z.B. so:
Delphi-Quellcode:
constructor Create(              owner_               : TComponent ); overload; override;
constructor Create(              owner_               : TComponent;
                    const sTestName_     : String ); reintroduce; overload; virtual;
Ich habe das Testprogramm nochmals erweitert und etwas komplizierter gemacht (um es mehr Richtung Realität zu bringen).
Nur funktioniert da alles wie gewünscht - sehr seltsam!

Ich habe das Projekt mal wieder angehängt...

Bodenseematze 1. Mär 2024 13:42

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

Zitat von Bodenseematze (Beitrag 1533950)
Zitat:

Zitat von himitsu (Beitrag 1533941)
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:
Delphi-Quellcode:
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:
Delphi-Quellcode:
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 :x

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?

himitsu 1. Mär 2024 14:44

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

Das lässt sich so nicht übersetzen
Wie jetzt.
Meckert Heult der nur rum (Info oder Warning), oder stoppt er wirklich die Arbeit (Error oder Fatal) ?

Zitat:

Method 'Create' hides virtual method of base type 'TCustomForm'
Du kannst versuchen das "normale" Create nach oben zu verschieben, aber oft bleibt nichts Übrig, als diese "unsinnige" Meldung via Reintroduce loszuwerden.

jaenicke 1. Mär 2024 15:41

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

Zitat von Bodenseematze (Beitrag 1534042)
Die Frage ist also immer noch: warum wird trotz "inherited"-Aufruf der eigene Konstruktor aufgerufen?

Entferne das override. Damit überschreibst du den geerbten Konstruktor, so dass dieser dann aufgerufen wird.

Die Konstruktion ist aber seltsam. Warum ruft der überschriebene Konstruktor mit einem Parameter den mit 4 Parametern auf, wenn der doch ohnehin wieder den mit einem Parameter aufruft? Ohne zu wissen was darin passiert, lässt sich dazu aber nicht viel sagen. Das kann man sicher anders lösen.

Eine Möglichkeit wäre, die Initialisierung aus dem Konstruktor auszulagern, so dass die Konstruktoren sich nicht mehr so viel gegenseitig aufrufen müssen. Im Konstruktor sollte im Normalfall auch nur die reine Initialisierung passieren, keine Ladevorgänge oder weitergehende Aktionen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 Uhr.
Seite 2 von 2     12   

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