AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Verweis auf Interface-Instanz weitergeben - ist das erlaubt?

Verweis auf Interface-Instanz weitergeben - ist das erlaubt?

Ein Thema von Bodenseematze · begonnen am 27. Feb 2024 · letzter Beitrag vom 1. Mär 2024
Antwort Antwort
Seite 2 von 2     12
Bodenseematze

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

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

  Alt 27. Feb 2024, 16:28
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:
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...
Angehängte Dateien
Dateityp: zip IfTest.zip (225,4 KB, 3x aufgerufen)

Geändert von Bodenseematze (27. Feb 2024 um 16:44 Uhr)
  Mit Zitat antworten Zitat
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.097 Beiträge
 
Delphi 12 Athens
 
#13

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

  Alt 1. Mär 2024, 14:44
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.323 Beiträge
 
Delphi 11 Alexandria
 
#14

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

  Alt 1. Mär 2024, 15:41
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz