![]() |
Delphi-Version: 5
richtigen Constructor aufrufen?
ich hab so einen teil, mit dem ich Objekte erzeuge, wo ich vorher nicht weiss, um was es sich handelt ...
Delphi-Quellcode:
Das Problem ist, das mitr dadurch der constructor nicht aufgerufen wirdValue := TClass(Args.Obj).Create
Delphi-Quellcode:
er geht mir wenn ich es so global mache nicht in den constructor rein, gibt es eine Möglichkeit das zu machen, ohne zu wissen, um was es sich handelt?
TMyList = class(TList)
public constructor Create; end; constructor TMyList.Create; begin inherited; Add(nil); end; wenn ich
Delphi-Quellcode:
schreibe, dann gehts natürlich genau so wie es soll ....
temp : TMyList;
temp := TMyList.Create; |
AW: richtigen Constructor aufrufen?
Du musst den Konstruktor als override deklarieren?!
Delphi-Quellcode:
constructor Create; override;
|
AW: richtigen Constructor aufrufen?
Du brauchst einen virtuellen Constructor oder du mußt den richtigen Klassen-Typen verwenden
Delphi-Quellcode:
TMyBaseObject = class(TList)
public constructor Create; virtual; abstract; end; TMyBaseClass = class of TMyBaseObject; TMyList = class(TMyBaseObject) public constructor Create; override; end; Value := TMyBaseClass(Args.Obj).Create;
Delphi-Quellcode:
TMyList = class(TMyBaseobject)
public constructor Create; end; TMyListClass = class of TMyList; Value := TMyListClass(Args.Obj).Create; Wie ist Args.Obj eigentlich definiert? |
AW: richtigen Constructor aufrufen?
Zitat:
Args.Obj ist eigetnlich ein TObject ... allerdings ist in einem Args.ObjTyp definiert das es sich nun um eine TClass handelt. Das problem ist, ich habe keinen zugriff auf die Objekte die ich hier create will. Es handelt sich um einen Interpreter in dem es möglich sein sollte Objekte zu kreieren .. diese sind alle mit {$M+} definiert, damit findet der Interpreter die, und eine Create kann ich auch aufrufen, nur dadurch das der constructor selbst nicht aufgerufen wird ... ist es natürlich etwas blöd ... es schein zu funktionieren -> aber halt etwas falsch ;) Ich vermute, das ich auf keinen grünen zweig kommen werde damit ... :( |
AW: richtigen Constructor aufrufen?
Das was du vor hast ist nicht möglich. Du musst schon eine gemeinsame Basisklasse haben und der Constructor muss entsprechend in abgeleiteten Klassen überschrieben werden.
Oder was würdest du zum Beispiel machen wenn jemand TComponent oder einen Nachfahren erzeugen will? Da braucht der Constructor einen Parameter der natürlich auch übergeben werden muss. (nicht umsonst müssen Komponenten die auf dem Formular platziert werden und automatisch erzeugt werden von TComponent abgeleitet sein) |
AW: richtigen Constructor aufrufen?
Geht es nur darum, den Code im Constructor auszuführen, da diese wichtige Dinge initialisiert?
Wenn nicht, dann nicht weiter lesen... :wink: Wenn doch dann verschiebe doch den Code vom Constructor in die Methode
Delphi-Quellcode:
Diese Methode wird immer nach dem Constructor ausgeführt und kann genausogut für Initialisierungen benutzt werden wenn eine Situation es nicht erlaubt den echten Constructor aufzufufen.
procedure AfterConstruction; override;
Ciao, Ralf |
AW: richtigen Constructor aufrufen?
Zitat:
Das sind Probleme ja schon vorprogrammiert. Zitat:
denn du kannst nur Methoden aufrufen, welche du an dieser Stelle kennst. TObjekt kennt nur sein Create und da dieses nicht als virtual/dynamic deklariert ist, kann dieses nicht überschrieben werden, womit abgeleitete klassen dort nicht rankommen. TObjekt und damit auch TClass kennen natürlich das Create deiner TList nicht, wodurch man darüber Dieses auch nicht aufrufen kann. Entweder du kämpfst dich über die RTTI zum richtigen Constuctor der entsprechenden Klasse durch oder du mußt alle nötigen Klassen selber umwandeln.
Delphi-Quellcode:
Wobei man bei sowas wie TEdit z.B. prüfen kann, ob Args.Cls als Vorfahren das TComponent besitzt und kann dann alle Nachfahren von TComponent über TComponent.Create(nil) erstellen, da TComponent einen virtuellen Constructor besitzt, welche alle Nachfahren überschrieben haben sollten.
if Args.Cls = TList then
Value := TList.Create else if Args.Cls = TEdit then Value := TEdit.Create else raise Exception.Create('du hast ein Problem'); Aber änder erstmal das
Delphi-Quellcode:
in ein
obj: TObjekt
Delphi-Quellcode:
und laß das rumgercaste.
cls: TClass
PS: Genau darum wurde in TComponent auch ein virtueller Constructor eingeführt, damit der DFM-Loader alle nötigen VCL-Komponenten laden kann, ohne deren abgeleitete Create kennen zu müssen. :zwinker: Der DFM-Loader kennt das Create von TComponent und da dieses virtuell ist, kann jede abgeleitete Klasse dieses für sich überschreiben und schon kennt der DFM-Loader auch diese Klassen. Bzw. er kennt die Adresse des virtuellen Create und nutzt alles, was darin verlinkt ist. |
AW: richtigen Constructor aufrufen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 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