Das Objektmodell, dass auf
object aufbaut stammt aus der Zeit von Turbo Pascal 6. Diese verhalten sich prinzipiell ähnlich zu Records, als dass sie sowohl auf dem Stack liegen können (oder eine statische Variable sein können), als auch, dass man einen Zeiger darauf haben kann und sie dynamisch anlegt. Im dynamischen Fall wird dann auch Polymorphie unterstützt (v.a. Verwendung von virtuellen Methoden).
Das Objektmodell, dass auf
class aufbaut wurde mit Delphi 1 eingeführt. Hier sind die Objektinstanzen
immer auf dem Heap und werden mit Hilfe eines Konstruktors angelegt. Dieses Objektmodell unterstützt viel mehr Funktionalitäten als es
object kann (Möglichkeit den Typ abzufragen, Implementierung von Interfaces,
published Properties mit Informationen, die zur Laufzeit abgefragt werden können (worauf die LCL aufbaut), um mal drei zu nennen). Auch haben Klassen
immer den Typ
System.TObject als Basis, während
object keinen Basistyp hat (die haben dann einfach keinen Parent).
Es ist nicht möglich diese beiden zu mischen (also im Sinne, dass ein
object von einer
class ableitet und umgekehrt).
Dieses Objektmodell hat das auf
object aufbauende im Großen und Ganzen verdrängt. Das heißt, wenn von einem
object die Rede ist, dann ist die Wahrscheinlichkeit groß, dass es sich auf eine Objektinstanz einer Klasse bezieht. Dies ist zum Beispiel bei den verschiedenen Container-Klassen der Fall:
TFPGList<> bezieht sich auf primitive Typen und Records (aber auch
object Typen), während
TFPGObjectList<> sich auf Objektinstanzen vom Typ
class bezieht. Ähnliches trifft auf
TList und
TObjectList aus der Unit
Contnrs zu.
Dein Beispiel mit dem
TTest = object(TObject) würde übrigens funktionieren, wenn du die Unit
Objects verwendest, da dort ein
TObject = object deklariert ist, welche als Basis für TP basierten Code dient (zum Beispiel Free Vision, welches von der Textmode IDE genutzt wird und noch auf
object basiert, baut darauf auf). In der gleichen Unit würde dann allerdings ein
TTest = class(TObject) zu einem Fehler führen.
Nimral hat geschrieben: Di 18. Jan 2022, 16:05
https://www.freepascal.org/docs-html/cu ... 0-940006.1
hat auch noch einen Beitrag zur großen Verwirrung zu leisten:
In MacPas mode, the Object keyword is replaced by the class keyword for compatibility with other pascal compilers available on the Mac. That means that in MacPas mode, the reserved word “class” in the above diagram may be replaced by the reserved word “object”.
Object und Class scheinen sowohl beide in Verwendung zu sein, als auch weithend die gleichen Funktionalitäten zu bieten. Irgendwie sind das zwei Parallelwelten?
Der Teil ist nur relevant, wenn du tatsächlich den Mac Pascal Dialekt einsetzt. Der Hintergrund ist, dass Mac Pascal sich parallel zu Turbo Pascal entwickelt hat und die ihren eigenen
object Typ eingeführt haben. Allerdings verhielt sich dieser von vornherein mehr wie Delphi's
class denn als TP's
object, weswegen in FPC der Compiler im Mac Pascal Modus zwar
object liest, aber letztlich intern ein
class draus macht.
