Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TInterfacedObject Vererbung (https://www.delphipraxis.net/55239-tinterfacedobject-vererbung.html)

Treffnix 18. Okt 2005 14:29


TInterfacedObject Vererbung
 
Hallo,

ich habe nicht viel Erfahrung mit TInterfacedObjects. Gibts da was, was ich wissen müsste?

Folgendes Problem, ich habe habe eine Ableitung von TInterfacedobject und eine Ableitung der Ableitung.

Ungefähr dieses Schema:

Delphi-Quellcode:

TMyBaseObject = class;

TMyBaseClass = class of TMyBaseObject;

TMyBaseObject = class( TInterfacedObject, TMyInterface );
....
public
  Constructor Create;
  Destructor Destroy; override;
End;

TMyChildObject = class( TMyBaseObject );
...
public
  Constructor Create;
  Destructor Destroy; override;
  Procedure DoSomething;
End;

...

Constructor TMyChildObject.Create;
Begin
  Inherited;
  DoSomething;
End;
Soweit, so schlecht. Nun habe ich eine TClasslist, in der ich eine Reihe ( derzeit nur 1 ) Ableitungen von TMyBaseObject ( in diesem Fall TMyChildObject ) verwalte. Über diese TClasslist versuche ich TMyChildObject zu erstellen.

Delphi-Quellcode:
Function GetInterface( i: Integer ): TMyInterface;
Begin
  Result := TMyBaseClass( Classlist[i] ).Create
End;
Das funktioniert auch soweit prima. Er erstellt das richtige Objekt, alle funktionen sind verfügbar. Das einzige Problem, das ich habe, ist, dass er in der Funktion GetInterface in den Constructor von TMyBaseObject läuft und nicht ( wie eigentlich von mir erwartet ) in den von TMyChildObjekt. Alles andere funktioniert wie gesagt wunderbar. Selbst wenn ich im Constructor von TMyBaseObject eine Funktion aufrufe, die die Ableitung auch bietet, läuft das Programm vom Constructor der Basis in die Funktion der richtigen Ableitung.

Wo liegt mein Fehler? :wall:

//edit:

Achso, fast vergessen und könnte auch ein Grund sein:

TMyChildObject ist in einer anderen Unit deklariert als TMyBaseObject. Die Classlist befindet sich allerdings in der Unit von TMyBaseObject. Die Unit von TMyChildObject ist nicht in der uses von TMyBaseObject.

//edit²: override ergänzt. ( s. Bernhard Geyer )

Bernhard Geyer 18. Okt 2005 14:45

Re: TInterfacedObject Vererbung
 
Beim ersten Destroy fehlt noch ein override und in den Destructoren muss als letzte Zeile inherited aufgerufen sein.

Treffnix 18. Okt 2005 14:48

Re: TInterfacedObject Vererbung
 
Zitat:

Zitat von Bernhard Geyer
Beim ersten Destroy fehlt noch ein override und in den Destructoren muss als letzte Zeile inherited aufgerufen sein.

Recht haste. Ist aber bei mir auch so umgesetzt. Hatte ich nur in den obigen Beispielen vergessen. Sorry! :oops:
Aber der Destructor wird auch korrekt aufgerufen. Nur der Constructor macht Probleme und ich weiss nicht warum....

Dax 18. Okt 2005 14:54

Re: TInterfacedObject Vererbung
 
Oh mein Gott :shock: Deine Konstruktoren sind statisch, und du greifst über ein Cast drauf zu.. Virtuell machen und es muss funktionieren ;)

Treffnix 18. Okt 2005 15:01

Re: TInterfacedObject Vererbung
 
Zitat:

Zitat von Dax
Oh mein Gott :shock: Deine Konstruktoren sind statisch, und du greifst über ein Cast drauf zu.. Virtuell machen und es muss funktionieren ;)

Virtuell machen im Sinne von
Delphi-Quellcode:
Constructor Create; virtual;
?

Das hatte ich schon versucht und gerade auch nochmal. Die gute Nachricht ist: Es ist nicht schlimmer geworden. Besser aber leider auch nicht... :cry:

//edit: Ich hab in meiner Verzweiflung auch schon komplett den Constructor von TMyBaseObject zu entfernen, mit dem Erfolg, dass dann nur der Constructor von TObject aufgerufen wurde...

Dax 18. Okt 2005 15:12

Re: TInterfacedObject Vererbung
 
Wenn du den TMyChildObject-Konstruktor als erstes durchlaufen sehen willst, musst du das inherited wohl oder übel ans Ende von TMyChildObject.Create setzen. Bei TObject bzw TInterfacedObject macht das nichts weiter, aber es ist nicht wirklich gut bei komplexen Objekten. Sei lieber vorsichtig ;) Dem am tiefsten unten liegen Konstruktor gehört das Erstarbeitsprivilieg.

jbg 18. Okt 2005 15:12

Re: TInterfacedObject Vererbung
 
Zitat:

Zitat von Treffnix
Das hatte ich schon versucht und gerade auch nochmal.

Hast du das in TMyBaseObject oder in TMyChildObject gemacht? In TMyBaseObject muss das "constructor Create; virtual;" rein und in TMyChildObject muss "constructor Create; override;" rein.

Treffnix 18. Okt 2005 15:22

Re: TInterfacedObject Vererbung
 
:wall:

Die Wahrscheinlichkeit, dass jemand den Thread hier löscht, ist nicht sehr groß, was? :oops:
Das Override hatte ich natürlich vergessen... :wall:

Ich werd mich mal eingraben...

Aber obwohl ihr mich hier bloßstellt: Großes Danke, Leute! :thumb:

jbg 18. Okt 2005 18:15

Re: TInterfacedObject Vererbung
 
Hat der Compiler dir da nicht eine Warnung gegeben? Bei mir wird kein Programm ausgeliefert, dass Hinweise oder gar Warnungen enthält (Optionen sind aktiv). Manche Hinweise sind zwar Compiler-Bugs (rechte wenige um genau zu sein), aber die kann man leicht umgehen, indem man den Code leicht umstellt (ohne die Symantik zu änder, versteht sich).


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 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