AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Objekt anhand der Klassenbezeichnung erzeugen

Objekt anhand der Klassenbezeichnung erzeugen

Ein Thema von SWE · begonnen am 10. Jun 2008 · letzter Beitrag vom 23. Jun 2008
Antwort Antwort
Seite 2 von 2     12
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#11

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 16:28
Zitat von Pascal P:
Allerdings wird nur mein Constructor der Basisklasse aufgerufen und nicht der des eigentlichen Objektes.
Du musst den Konstruktor virtuell machen!
Aus diesem Grund ist auch der Konstruktor von TComponent virtuell. Ansonsten würde das dynamische Laden von Komponenten aus dem DFM-Resourcen nicht funktionieren.
Andreas
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#12

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 16:29
Hilfe gut und schnell abgekupfert. Sehe gerade in der Test-Prozedur, wo wird denn da überhaupt das gewünschte Objekt created ? Erzeuge das mal lieber direkt. Also so :
obj := TExtendedClass.Create;
Gruß
Hansa
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#13

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 16:39
Aber müsste nicht der neue constructor den alten trotzdem (rein logisch gesehen) verdecken?
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#14

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 16:48
Mit override wird der verdeckt. Den Constructor der Basisklasse kann man dann mit inherited explizit aufrufen.
Gruß
Hansa
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#15

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 16:55
Zitat von Vjay:
Aber müsste nicht der neue constructor den alten trotzdem (rein logisch gesehen) verdecken?
Nicht, wenn der neue Konstruktor mit override deklariert wurde.
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:
TBaseObject = class(...)
  constructor Create; virtual;
  ...
end;
TExtendedObject = class(TBaseObject)
  constructor Create; override;
  ...
end;
TExtendedObject2 = class(TBaseObject)
  constructor Create; override;
  ...
end;
Man kann sich das alles aus der TComponent Hierarchie abschauen.
Andreas
  Mit Zitat antworten Zitat
Pascal P

Registriert seit: 16. Nov 2007
14 Beiträge
 
#16

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 17:23
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:
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;
Funktionieren tut es noch immer wie davor. Es wird der Constructor der Basisklasse verwendet und nicht der der eigentlichen Klasse.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#17

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 17:26
Du hast das override beim Konstruktor der abgeleiteten Klasse vergessen!!
Delphi-Quellcode:
TExtendedObjekt = class (TBaseObjekt)
public
    constructor Create; override; // <==
end;
Andreas
  Mit Zitat antworten Zitat
Pascal P

Registriert seit: 16. Nov 2007
14 Beiträge
 
#18

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 20. Jun 2008, 17:30
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
  Mit Zitat antworten Zitat
SWE

Registriert seit: 2. Mär 2006
19 Beiträge
 
Delphi 2005 Enterprise
 
#19

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 23. Jun 2008, 08:13
Du solltest natürlich nicht vergessen im Konstruktor Deiner abgeleiteten Klasse "inherited" aufzurufen:

Delphi-Quellcode:
constructor TExtendedObjekt.Create;
begin
  inherited;
  Self.strName := 'Extendet';
end;
  Mit Zitat antworten Zitat
Pascal P

Registriert seit: 16. Nov 2007
14 Beiträge
 
#20

Re: Objekt anhand der Klassenbezeichnung erzeugen

  Alt 23. Jun 2008, 08:34
Alles seit Freitag in Sack und pack, genau so wie ich es wollte.
Danke nochmals für die gute Hilfe.
  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:12 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