Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi tObject erstellen mittels tClass? (https://www.delphipraxis.net/91897-tobject-erstellen-mittels-tclass.html)

Arthur Hoornweg 11. Mai 2007 14:58


tObject erstellen mittels tClass?
 
Moin moin,

ich versuche Objekte zu instanziieren wenn deren Classtype
bekannt ist. So was in der Art wie

Function CreateObject(t:tclass):tobject;
begin
result:=t.create;
end;

Mein Problem: Der Constructor vom Objekt wird nicht
aufgerufen. Selbst nicht, wenn er virtuell ist.
Wie bekomme ich das hin?

gruss,

Arthur

Elvis 11. Mai 2007 15:05

Re: tObject erstellen mittels tClass?
 
Zitat:

Zitat von Arthur Hoornweg
Mein Problem: Der Constructor vom Objekt wird nicht
aufgerufen. Selbst nicht, wenn er virtuell ist.
Wie bekomme ich das hin?

Hi Arthur :hi:

TClass an sich hilft dir nicht viel weiter. Gerade weil der Konstruktor von TObject nicht virtuell ist.
Du musst dir also eine neue Basisklasse aussuchen und der einen virtuellen Konstruktor verpassen:
Delphi-Quellcode:
type
  TBaseClass = class
  public
    constructor Create; virtual; abstract;
  end;
  TBaseClassClass = class of TBaseClass;
Delphi-Quellcode:
var
  classRef : TBaseClassClass;
 
begin

  classRef := ...
 
  result := classRef.Create();
...und nun sollte auch der Konstruktor aufgerufen werden.

Die Alternative wäre AfterConstruction für den Initialisierungs code herzunehmen. Dadurch bist du nicht auf einen bestimmten Konstruktor angewiesen und auch der von TClass/TObject würde reichen.

btw: Ich hab' deinen Namen irgendwo schon einmal gesehen, wahrscheinlich non-tech, right?

Muetze1 11. Mai 2007 23:35

Re: tObject erstellen mittels tClass?
 
Warum wurde der Constructor als Abstract deklariert? Was für ein Hintergedanke führte dazu?

3_of_8 11. Mai 2007 23:37

Re: tObject erstellen mittels tClass?
 
Ein abstrakter Konstruktor? :shock:

Ich frag mich grad noch, was der Grund dafür ist, dass der Konstruktor nicht aufgerufen wird: Dass er statisch ist oder dass für TObject keine RTTI existiert. :gruebel:

Muetze1 11. Mai 2007 23:43

Re: tObject erstellen mittels tClass?
 
Der von TObject wird ja aufgerufen, aber da er nicht virtuell ist, kann er nicht überschrieben werden. Ein neuer Constructor in der Ableitung verdeckt den von TObject und belegt einen neuen Platz in der VMT (ein virtual/override würde ihn ersetzen in der VMT).

RTTI spielt hier keine Rolle. Die VMT wird vom Compiler gebaut und braucht keine RTTI, da die VMT Tabellen fest verdrahtet geschrieben werden (zumindest die Offsets für den Zugriff innerhalb der VMT).

Elvis 11. Mai 2007 23:57

Re: tObject erstellen mittels tClass?
 
Zitat:

Zitat von Muetze1
Warum wurde der Constructor als Abstract deklariert? Was für ein Hintergedanke führte dazu?

Ist ja als rein abstrakte Klasse gedacht, die den Platz von TObject als Root einnehmen soll.
Wozu also eine Implementierung eines leeren Konstruktors liefern? ;-)


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