Thema: Delphi TObject = Object ?

Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

Re: TObject = Object ?

  Alt 3. Jan 2006, 19:02
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).
  Mit Zitat antworten Zitat