![]() |
TObject = Object ?
Hi,
Ich habe grad das Object (neu)entdeckt. Wenn man Klassen so definiert:
Delphi-Quellcode:
dann ist hat die Klasse wie records keine Eigenschaften. ABER sie kann proceduren beinhalten...
TKlasse = Object
Und man hat nicht das lästige Zeug von TObject (ob lästig oder notwendig sei mal dahingestellt :mrgreen:) :) Eigentlich die perfekte Klasse :D So jetzt zur Hauptfrage: Jedenfalls hatte ich dann die Theorie das TObject von Object abgleitet sein könnte. Was ich logisch finde. Aber in der Definition steht
Delphi-Quellcode:
Aber wie kann das sein ?
TObject = class
Delphi-Quellcode:
:arrow:
TIrgendeineKlasse = class
<=> TIrgendeineKlasse = class(TObject)
Delphi-Quellcode:
Aber das ist ein noch größerer Unsinn..
TObject = class(TObject)
Gruß Michi |
Re: TObject = Object ?
War die Verwendung von object nicht früher beim objektorientieren TP State-of-the-Art und später dann in Delphi kam class?
Und
Delphi-Quellcode:
sind das Gleiche.
MyObject = class
//und MyObjectZwo = class(TObject) |
Re: TObject = Object ?
Zitat:
Und da
Delphi-Quellcode:
gilt, gilt genauso auch
TObject = class
Delphi-Quellcode:
was aber Unsinn ist.
TObject = class(TObject)
|
Re: TObject = Object ?
Hi,
Ja, kann Ultimator natürlich nur zustimmen, möchte hier aber dann auch gleich auf die Forum-Suche verweisen! Da findest du schon genügend zu Object vs. TObject. Das eine Klasse ohne Angabe von einer speziellen Klasse immer von TObject abgeleitet wird ist natürlich einfach nur dem Compiler zu verdanken, der einfach nachschauen kann ob es eine Basisklasse gibt (sonst TObject). Natürlich kann der auch mit der Definition von TObject umgehen ohne sich hier rekursiv einen Kreis zu bauen. Gruß Der Unwissende |
Re: TObject = Object ?
TObject befindet sich nicht umsonst in der Unit, in der die Hochsprache aufhört und die Compiler-Magic anfängt :zwinker: .
|
Re: TObject = Object ?
Tatsächlich ist TObject auch von class abgeleitet. Das ganze steht in der unit system die bei jeden Delphi Projekt dabei ist, somit ist TObject nicht von Object abgeleitet.
Delphi-Quellcode:
TObject = class
constructor Create; procedure Free; ... destructor Destroy; virtual; end; |
Re: TObject = Object ?
ABER: Nach euren Theorien müsste ja bei folgendem Beispiel THallo von class abgeleitet sein und nicht von TObject...
Delphi-Quellcode:
unit Unit1;
interface // KEINE Uses.. kein TObject und nix type THallo = class Hallo: String; procedure SetHallo; end; implementation { THallo } procedure THallo.SetHallo; begin Hallo := 'Hallo'; Self.Destroy; // Und alle anderen TObject Methoden sind verfügbar end; end. |
Re: TObject = Object ?
Moment, hier scheinen manche etwas zu verwechseln:
![]() Object ist ein Schlüsselwort, das noch aus Pascal-Zeiten stammt und sowas wie ein vorreiter des class-Keywords war. Object hat also nix mit TObject zu tun, und man kann auch nicht eine Klasse von object ableiten. Lasst euch nicht durch die ähnliche Namensgebung drausbringen ;) Und bezüglich TObject/class/CompilerMagic: Man kann nicht 'von class ableiten'. TObject ist eine Klasse, welche stinknormal implementiert wurde. CompilerMagic tritt ein, wenn eine Klasse (außer TObject) deklariert wird, die keine andere Klasse erbt: Dann wird nämlich automatisch TObject vererbt. greetz Mike |
Re: TObject = Object ?
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 ?
|
Re: TObject = Object ?
Zitat:
Zitat:
Zitat:
|
Re: TObject = Object ?
Das wird mir langsam zu hoch :mrgreen:
TObject ist für mich ein Mysterium^^ Naja vielleicht nicht mehr soviel wie vor ein paar Minuten aber trotzdem ;) Danke für die Antworten und den Versuch mir was zu erklären :D Gruß Michael |
Re: TObject = Object ?
Zitat:
Delphi-Quellcode:
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.
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; 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). |
Re: TObject = Object ?
Zitat:
|
Re: TObject = Object ?
Zitat:
|
Re: TObject = Object ?
Richtig.
Objecte können proceduren und functionen haben und Variablen. Haben aber von Natur aus keine Variablen oder Methoden genau wie Records. Und man muss sie genauso wie records nicht erstellen, kann aber trotzdem mit proceduren und Functionen arbeiten. Wie es jedoch mit OOP und Vererbung etc aussieht weiß ich nicht. Beispiel:
Delphi-Quellcode:
TMensch = Object
Name: String Alter: Word; procedure Bewegen(x,y: Integer); function Ka: Boolean; end; procedure TForm1.Button1Click(Sender: TObject); var Ich: TMensch; begin Ich.Name := 'Michael'; Ich.Alter := 17; Ich.Bewegen(MeinZimmer.x,MeinZimmer.y); end; |
Re: TObject = Object ?
Hey Danke, spricht abgesehen von
Vererbung etwas gegen die Nutzung von dieser Art von Objekten? Aus jbgs Beitrag versteh ich nicht viel. :wink: |
Re: TObject = Object ?
Eine VMT würde keinen Sinn machen, wenn man nicht erben kann:
Delphi-Quellcode:
type
PFigure = ^TFigure; TFigure = object X, Y: Integer; constructor Init(AX, AX: Integer); destructor Done; virtual; procedure Draw; virtual; end; PCircle = ^TCircle; TCircle = object(TFigure) R: Integer; constructor Init(AX, AY, AR: Integer); destructor Done; override; procedure Draw; override; end; PRectangle = ^TRectangle; TRectangle = object(TFigure) X1, Y1: Integer; constructor Init(AX0, AY0, AX1, AY1: Integer); procedure Draw; override; end; var DynFigure: PFigure; StaticFigure: TFigure; // behandeln wie einen Record begin DynFigure := New(PRectangle, Init(10, 10, 20, 20)); DynFigure^.Draw; // zeichnet ein Rechteck Dispose(DynFigure, Done); StaticFigure.Init(10, 10); StaticFigure.Draw; // zeichnet einen Punkt StaticFigure.Done; end. |
Re: TObject = Object ?
Übrigens wie ich gerade herausgefunden hab:
Vererbung FUNKTIONIERT ! |
Re: TObject = Object ?
Aber nicht mit dem Quelltext von jbg.
|
Re: TObject = Object ?
Delphi-Quellcode:
1. Flaeche existiert auch in der Klasse Haus.
Gebaeude = Object
Flaeche: Integer; procedure Bauen; end; Haus = Object(Gebaeude) NeNeueVar: String; procedure Bauen; end; 2. Man kann entweder "Bauen" so "überschreiben":
Delphi-Quellcode:
oder/und die Methode einfach vererben:
procedure Haus.Bauen;
begin Form1.Caption := 'Haus bauen!'; end;
Delphi-Quellcode:
procedure Haus.Bauen;
begin inherited; // eventuell weiterer Quelltext end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz