![]() |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Zitat:
Aus diesem Grund ist auch der Konstruktor von TComponent virtuell. Ansonsten würde das dynamische Laden von Komponenten aus dem DFM-Resourcen nicht funktionieren. |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Hilfe gut und schnell abgekupfert. :mrgreen: Sehe gerade in der Test-Prozedur, wo wird denn da überhaupt das gewünschte Objekt created ? Erzeuge das mal lieber direkt. Also so :
Delphi-Quellcode:
obj := TExtendedClass.Create;
|
Re: Objekt anhand der Klassenbezeichnung erzeugen
Aber müsste nicht der neue constructor den alten trotzdem (rein logisch gesehen) verdecken?
|
Re: Objekt anhand der Klassenbezeichnung erzeugen
Mit override wird der verdeckt. Den Constructor der Basisklasse kann man dann mit inherited explizit aufrufen.
|
Re: Objekt anhand der Klassenbezeichnung erzeugen
Zitat:
Dann muss aber auch die Signatur, also Anzahl und Datentypen der Übergabeparameter, immer so sein, wie das in der Basisklasse einmal festgelegt wurde.
Delphi-Quellcode:
Man kann sich das alles aus der TComponent Hierarchie abschauen.
TBaseObject = class(...)
constructor Create; virtual; ... end; TExtendedObject = class(TBaseObject) constructor Create; override; ... end; TExtendedObject2 = class(TBaseObject) constructor Create; override; ... end; |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Irgendwie muss ich grad voll ends auf dem Schlauch stehen. Habe mal eben die Änderung mit virtual gemacht. gehen tut es aber noch immer nciht.
Mein Programmcode sieht nun in etwa so aus.
Delphi-Quellcode:
Funktionieren tut es noch immer wie davor. Es wird der Constructor der Basisklasse verwendet und nicht der der eigentlichen Klasse.
TBaseObjekt = class (TPersistent)
public strName : String; constructor Create; virtual; end; TBaseObjectClass = class of TBaseObject; TExtendedObjekt = class (TBaseObjekt) public constructor Create; end; constructor TBaseObjekt.Create; begin Self.strName := 'Base'; end; constructor TExtendedObjekt.Create; begin Self.strName := 'Extendet'; end; procedure Test(); var cls : TPersistentClass; obj : TBaseObject; begin // Klassenreferenz ermitteln cls := FindClass('TExtendedObjekt'); // Objekt-Instanz erzeugen obj := TBaseObjectClass( cls ).Create(); // Test-Ausgabe ShowMessage(TExtendedObjekt(obj).strName); // Die Ausgabe sollte dann Base sein end; |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Du hast das override beim Konstruktor der abgeleiteten Klasse vergessen!!
Delphi-Quellcode:
TExtendedObjekt = class (TBaseObjekt)
public constructor Create; override; // <== end; |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Argh, vor lauter Bäumen den Wald nicht mehr gesehen. Okey, danke nochmals. In einem kleinen Testprogramm funktioniert es jetzt.
Werd es dann mal versuchen vollends zu implementieren. Vielen Danke. Wenn ich noch Probleme habe, meld ich mich nochmals :D |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Du solltest natürlich nicht vergessen im Konstruktor Deiner abgeleiteten Klasse "inherited" aufzurufen:
Delphi-Quellcode:
constructor TExtendedObjekt.Create;
begin inherited; Self.strName := 'Extendet'; end; |
Re: Objekt anhand der Klassenbezeichnung erzeugen
Alles seit Freitag in Sack und pack, genau so wie ich es wollte.
Danke nochmals für die gute Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 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