Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

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

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 17:57
Jain. In der Klassenstruktur steht zwar ein Zeiger auf den aktuell implementierenden Konstruktor der Klasse, Konstruktoren sind damit per se immer virtuell Das steht nicht in der VMT -> virtual Method Table, diese ist nur einer der Bestandteile einer heutigen Klassenstruktur. Siehe System.pas.

aber !

Wir möchten dynamisch zur Laufzeit erst die zu erzeugende Klassse definieren, wie im Beispiel ob TBaseClass und/oder TSecondClass. Damit man beiden Klassen auf diese Art&Weise erzeugen kann und auch Paramater dieser Klassen übergeben kann muß man nit explizit virtuell deklarierten Klassen arbeiten.

Macht man die nicht so würde im 2. Aufruf in der BaseClass den Klassentyp TSecondClass enthält nicht der Constructor von TSecondClass aufgerufen sondern derjenjge Konstruktor der über

type
TBaseCLass = class of TBaseClass

deklariert wurde. Im zweiten Aufruf würde man also Konstruktor TBaseClass.Create aufrufen aber eine Instance vom Typ TSecondClass erhalten ! Hat man nun im Konstruktor von TSecondClass eigene individuelle Implementierungen vorgesehen so würden diese eben nicht ausgeführt werden. Man erzeugt eine Instance vom Typ TSecondClass ruft aber TBaseClass.Create auf.

Probierts einfach aus. In den obigen 2 Klasen im Konstruktor eine ShowMessage(ClassName) rein. Dann als 1. den Konstruktor nicht virtual deklarieren und den Test Code von oben starten. Es muß 2 mal "TBaseClass" angezeigt werden obwohl wir einmal eine Instance von TBaseClass und einmal von TSecondClass erzeugt haben. Dann alles virtuell machen. Nun geht so wir gewünscht.

Metaklassen können meistens nur dann sinnvoll benutzt werden wenn deren Konstruktor als virtual deklariert wurde. So wie bei TComponent.Create(AOwner: TComponent);

Metaklassen, ich mag diese Wort nicht für diese Art der OOP. Es gibt defakto keine Unterscheidung zwischen diesen Metaklassen, also der Benutzung von typisierten Klassenvariablen -> type class of Class, zu der Benutzung vin Klassen im Allgemeinen. Die Deklaration/Benutzung von Klassen ist genauso OOP wie die Deklaration/Benutzung von typsisierten Klassen-Variablen oder von typisierten Instanzen einer Klasse, kurz Objekten. Alles sind Features der OOP, Metaklassen suggeriert was falsches und ist eine Marketingschpfung, selbst wenn sich nur ein schlauer Programmierer damit besser verkaufen möchte.

Metaklassen sind nichts anderes als Klassenvariablen um dynamisch den Typ der zu erzeugenden Instanzeklasse festlegen zu können.
Der Typ so einer Klassevariablen ist immer ein

type class of Class; Diese Deklaraton suggeriert das man einen Klasentyp zu einer Klassenhierarchie als Überbau deklariert, sprich eine Metaklasse. Das ist Quatsch. Man deklariert einen neuen Datentyp vom Typ Pointer der aber typisiert nur Klassen aufnehmen kann die von de Basis Klasse abgleietet wurden. Wenn es eine Metaklasse wäre dann könnte man mit TBaseClassClass.Create() auch eine Meta-Instance also Meta-Objekt dieser Metaklasse erzeugen.

Es sind typsierte Klassenvariablen und definitiv eine Grundlage für die Polymorphie der Klassen. Es ist Polymorph af Klassenebene weil in der Variablen "BaseClass"

1.) nur typisierte und von der Mutterklasse TBaseClass abgeleitete Klassen gespeichert werden können. Der Compiler wird einen Fehler bringen wenn man was anders versucht.
2.) alle dynamisch zur Laufzeit veränderlich ist, also immer ein anderes Gesicht annehmen kann, ja nach Klassentyp den man in dieser Variable speichert
3.) eben Zeiger auf eine Klasse, und das ist ein hardcoded Recordstruktur im Codesegement die eine Klasse beschreibt, speichert.

Gruß Hagen

[edit]ähm sorry für meine Tippfehler, das trainiert eure Intelligenz, seht's positiv [/edit]
  Mit Zitat antworten Zitat