Zitat von
Neutral General:
Aber ich meine es wäre logisch wenn TObject = Object wäre und das Object hätte dann halt die ganzen Methoden verpasst bekommen und dann wurden die anderen folgenden Komponenten halt von TObject abgleitet. Was ist denn TObject sonst ?
class und
object sind zwei verschienene Konzepte. Das ältere
object ist nichts anderes als ein
record, der Methoden, eine
VMT und eine DMT hat.
object Objekte werden immer auf dem Stack oder im Datensegment angelegt, wenn man keine Zeiger-Typ darauf nutzt.
Delphi-Quellcode:
PMyObject = ^TMyObject;
TMyObject = object
constructor Init(const A: string);
destructor Done;
procedure Haha; virtual;
end;
var
P: PMyObject;
begin
P := New(PMyObject, Init('Hallo'));
P^.Haha;
Dispose(P, Done);
end;
Ein
class Objekt liegt immer im Heap (freier Speicher) und nutzt um einiges mehr Compilermagic als das alte
object. Das fängt schon beim Konstruktor an, der nicht aus einer Methode besteht sondern aus meheren (NewInstance + Create + AfterConstruction). Der Compiler versteckt das aber vor unseren Augen.
TObject is eine
class und kein
object. Die beiden Arten von "Klassen" sind nicht binärkompatibel. So liegt bei
class die
VMT immer an Offset 0, wohingegen bei
object die
VMT erst dann eingefügt wird, wenn die erste virtuelle Methode zum Objekt hinzukommt. Alle vorher definierten Felder verschieben also den Offset des
VMT-Zeigers bei
object. Die
VMT ist bei
class eine Metaklasse (beschreibt also die Klasse selbst). Dies ermöglicht die Nutzung von virtuellen Konstruktoren und virtuellen Klassenmethoden (Stichwort: TClass = class of TObject). Bei
object wird die
VMT ihrem Namen mehr gerecht, denn dort ist sie nur eine Tabelle der virtuellen Methoden (Virtual Method Table) mit einem zusätzlichen DMT-Zeiger (Dynamic Method Table).