Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#12

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 16:10
Zitat:
Der Konstruktor wird ja aufgerufen, bevor das Objekt existiert-
Falsch der Konstruktor wird aufgerufen nachdem das Objekt auf dem Speicher erzeugt und initaisiert wurde damit man in seinem eigenen Konstruktor diese Instance noch weiter initialisieren kann. Ist der Konstruktor dabei virtuell und override deklariert wurden dann kann man mit Hilfe eines dynamischen Klassentypes der Vorfahrklasse in einer Variable auch eine Instance der abgeleiteten Klasse als Instance erzeugen. Deshalb machen virtuelle Konstruktoren auch einen Sinn.

Delphi-Quellcode:
type
  TBaseClass = class(TObject)
    constructor Create(const BaseClassParameter); virtual;
  end;

  TBaseClassClass = class of TBaseClass;

  TSecondClass = class(TBaseClass)
    constructor Create(const BaseClassParameter); override;
  end;

procedure Test;
var
  BaseClass: TBaseClassClass;
begin
  BaseClass := TBaseClass;
  with BaseClass.Create(Params) do Free;

  ShowMesssage(BaseClass.ClassName);


  BaseClass := TSecondClass;
  with BaseClass.Create(Params) do Free;
  
  ShowMesssage(BaseClass.ClassName);
end;
Eine Variable BaseClass enthält den Klassetyp den man dynamisch zu Laufzeit erzeugen möchte. Die Regeln der Klassevererbung herrschen also auch bei Klassenvariablen und Klassenmethoden. Beim Konstruktor ist nun wichtig das er virtuell ist damit man unabhängig von der realen Klasse in der Variablen BaseClass auch dynamisch eine Instanz erzeugen kann.

Manche bezeichnen das als Metaklassen. Wichtig ist nur zu wissen das es ohne diese Feature, also auch der Möglichkeit von virtuellen Konstruktoren in diesem Zusammenhang die Streaming-Fähigkeiten der VCL garnicht umsetzbar wären. Alsodas Speihcern und Laden von Komponenten samt TForm in einen Stream als DFM Resource/Datei. Auch die TGraphic Objecte würden als Ganzes nicht die gewohnte Funktionalität bieten.

Die Möglichkeit für virtuelle Konstruktoren sind also ein MUSS !

Nochwas zur Erstellungsreiehenfolge von Instancen:

1.) .InstanceSize wird aufgerufen um die Größe des Speichers des Objektes zu ermitteln
2.) .InitInstance wrd aufgerufen um kompexe Datenstrukturen die als Felder im Objekt deklariert wurden zu initlaisieren
3.) erst jetzt wird der Konstruktor aufgerufen der seinerseit eventuell inherited Konstruktor aufruft
4.) .AfterConstruction wird aufgerufen

Gruß Hagen
  Mit Zitat antworten Zitat