AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Was ist ein Objekt ?

Ein Thema von mr_emre_d · begonnen am 27. Jul 2008 · letzter Beitrag vom 29. Jul 2008
Antwort Antwort
Seite 2 von 3     12 3      
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Was ist ein Objekt ?

  Alt 27. Jul 2008, 16:10
Nein es geht um den Unterschied von

Delphi-Quellcode:
TObj = Object
    ...
end;
und

Delphi-Quellcode:
TCl = Class
    ...
end;
Markus Kinzler
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#12

Re: Was ist ein Objekt ?

  Alt 28. Jul 2008, 16:22
Appol.:
Das mit Create geht nicht !

Hier ein Codebsp:
Code:
  TBlubObject = object
    Blub: String[50];
    constructor Create;
    procedure ShowBlub;
  end;
.
.
.

implementation

procedure TForm1.FormCreate(Sender: TObject);
var
  Blub1, Blub2: TBlubObject;
begin
  Blub1 := TBlubObject.Create; // --> das geht nicht! 
  Blub1.ShowBlub;

  Blub2.Blub := 'Das ist Blub2';
  Blub2.ShowBlub;
end;

constructor TBlubObject.Create;
begin
  Blub := 'Schwachsinn';
end;

procedure TBlubObject.ShowBlub;
begin
  ShowMessage( Blub );
end;
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#13

Re: Was ist ein Objekt ?

  Alt 28. Jul 2008, 16:32
Soweit ich mich an Objects erinnern kann, musst du die nicht extra erstellen.
Delphi-Quellcode:
type
  TBlubObject = object
    Blub: String[50];
    procedure Initiate;
    procedure ShowBlub;
  end;

procedure TForm1.ButtonClick(Sender: TObject)
var Blub: TBlubObject;
begin
  Blub.ShowBlub; // Leerstring ausgeben
  Blub.Initiate; // "Blub.Blub := 'irgendwas'
  Blub.ShowBlub; // 'irgendwas' ausgeben
end;

procedure TBlubObject.Initiate;
begin
  Blub := 'irgendwas';
end;

procedure TBlubObject.ShowBlub;
begin
  ShowMessage(Blub);
end;
Alle Angaben ohne Gewähr, da Delphi nicht offen
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Was ist ein Objekt ?

  Alt 28. Jul 2008, 17:03
Es gab damals keine Konstruktoren/Destruktoren
Markus Kinzler
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#15

Re: Was ist ein Objekt ?

  Alt 28. Jul 2008, 18:57
Zitat von mkinzler:
Es gab damals keine Konstruktoren/Destruktoren
Wann ist damals? In TP5.5 gab es die schon. Und vorher gab es keine Objekte in TP.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Was ist ein Objekt ?

  Alt 28. Jul 2008, 19:32
In meiner erinnerung gab Methoden aber keine Konstruktoren
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Was ist ein Objekt ?

  Alt 28. Jul 2008, 20:11
Ohne unhöflich erscheinen zu wollen: Ihr könnt doch lesen, oder? In Beitrag 6 habe ich ein funktionsfähiges Beispiel mitsamt Konstruktor gepostet.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Was ist ein Objekt ?

  Alt 28. Jul 2008, 22:12
Worin liegt der primäre Unterschied zwischen einem Ottomotor und einer Gasturbine ? Das eine ist die Weiterentwicklung des Anderen. Und Gleiches trifft auf Objekte und Klassen zu, wobei schon die Namensgebung im Grunde falsch ist.

Klassen sind mit Objekten garnicht vergleichbar da eine Klasse eher wie ein Template die allozierbaren Objekte = Instanzen umschreiben. Wir erzuegen aus einer Klasse, also einem OOP Typ, durch Allozierung im Heap oder meinetwegen auch Stack, eine Instanz. Diese Instanz bezeichnet man auch als ein Objekt.

Eine Klasse ist also eine Datentyp-Deklaration die das Verhalten und Aussehen ihrer zur Laiufzeit erstellbaren Instanzen = Objekte definiert.

Evolutionär betrachtet waren die Delphi, eg. Borland Pascal 5, Objekte nur die Vorstufe zu Klassen. Später wurden die "Klassen" als solches eingeführt aber im Grunde könnten die alten Delphi Objekte alles das unterstützen was heutige Klassen können. Eine Klasse in Delphi unterscheidet sich auf 3 Arten von Objekten in Delphi

1.) die Art und Weise wie deren Klasse im Codesegment gespeichert wird. Eine Klasse ist ein Record im Codesegement indem per RTTI=Run Time Type Information alles was diese Klasse kann gespeichert wurde. Also die virtuellen und dynamischen Methoden in der VMT und DMT, alle publisched Eigenschaften und Ereignismethoden samt Paramater dieser Methoden, alle implementierten Intaerfaces usw. usw.
Die alten Objekte in Delphi stellen eine Untermenge dieser Klassenstruktur dar, das erkennt man auch sehr einfach im Aufbau dieses Klasenrecords. Der Klassenzeiger, also TObject.ClassType^ = PPonter(Self)^^ zeigt mitten in diesen Klassenrecord im Codesegment exakt an den Begin der VMT=Virtual Method Table. Nun die alten Objekte und deren Klassenrecord begint exakt mit einem Zeiger auf diese VMT. Einige der nachfolgenden Felder innerhalb dieses Klassenrecords sind zwischen den alten Objekten und neuen Klassen identisch.

2.) Die Möglichkeit polymorphe Klassen zu benutzen. Das ist nicht identisch mit der Polymorphie innerhalb der Klassenhierarchie sondern meint das man mit variablen/dynamsichen Klassen arbeiten kann und somit dynamisch den Typ der Klasse nach der man eine Instanz/Objekt allozieren/initialkiseiren möchte.

3.) eine Klasse ist nur eine syntaktische Unterscheidung zwischen der Deklaration eines OO-Types und der daraus allozierbaren Instanzen/Objekte zur Laufzeit. Damit hat Borland das OOP Konzept nur syntaktisch "aufgeräumt" im Vergleich zu den "alten Objekten".

Sogesehen besteht der Hauptunterschied zwischen Klassen und alten Objekten in Borland Delphi nur darin das das eine veraltet ist und das Andere die konsequente Weiterentwicklung der Objekte hin zu Klassen darstellt.

Objekte konnte man von Anfang an auch im Heap dynamisch allozieren und man benutzte dazu auch Konstruktoren und Destruktoren (allerdings manuell deklariert und aufgerufen, gehörte damals zum guten Ton seine Objekte mit virtuellen Initializations-Methoden zu versehen, genannt Konstruktoren). Die vergleichbaren Destruktoren/Konstruktoren in Klassen sind im Grunde normale Klassenmethoden, also Methoden deren impliziter Parameter Self nicht auf die Instanz einer Klasse zeigt sondern auf die Klassendefinition selber, also ein Zeiger in das Codsegment in der der Compiler alles wichtige zu dieser Klasse abgespeichert hat.

Der Unterschied zwischen Konstruktoren/Destruktoren im Vergleich zu normalen Klassenmethoden besteht darin das in der VMT/DMT der Klasse keine eigenen Slots eingerichtet werden, sondern das beide Methoden innerhalb der Klassenstruktur an festem Offset ihren Zeiger auf die implementierende Methode besitzen. Das ist aber eher ein Relikt bei der Weiterentwicklung durch Borland und nicht das allgemeingültige Konzept wie man Klassen speichert. Viel öfters werden diese Spezialmethoden in anderen Sprachen genauso behandelt wie ganz normale virtuelle/dynamische Klassenmethoden. Dies zeigt sich auch darin das man in neueren Delphi Version auch diese Konstruktoren/Destruktoren überladen kann, aber das ist ein anderes Thema.

Fazit: der Unterschied zwischen Objekten und Klassen besteht darin das man Objekte nicht mehr benutzen sollte da sie durch Klassen ersetzt wurden und diese mehr können. Und zweitens räumt der syntaktische Aufbau bei einer Definition und Benutzung einer Klasse mit den Verständnisschwierigkeiten der alten syntaktischen Schreibweise der Objekte auf. Das ist übrigens der wichtigste Grund warum Klassen mächtiger sind, sie sind leichter für den Programmierer verständlich.

Das OOP Konzept der Trennnung von Klassen, darauf aufbauend Klassenhierarchien, von deren zur Laufzeit allozierten Instanzen, also Objekten, ist schon mit Borland Pascal bekannt. Aber die explizite syntaktische Trennung beider erst mit der Einführung von Klassen, also dem Bezeichner class und class of. Grundsätzlich konnte man auch mit den alten Objketen alles das machen was heutige Klassen können aber das Verständnis der Entwickler scheiterte an dem Punkt das es syntaktisch keine klare Trennung gab.

Ich habe mit den alten Objekten schon zu Zeiten von Turbo Vision unter DOS mit all den Features gearbeitet die mit heutigen Klassen so möglich sind. Nur das man heutzutage syntaktisch sauberer OO-programmiert und mit den alten Objekten eben teilweise tricksen musste. Letzendlich ist die Unterstützung des Compilers verantwortlich das man mit den alten Objekten nicht so arbeiten kann wie mit den neuen Klassen, technisch gesehen ist beides das Gleiche, ein Record aus Felder als Laufzeit Objekt der irgendwo ein Datenfeld besitzt der auf eine Record der Klasse zeigt und dieser Klassenrecord ist fix irgendwo gespeichert und enthält alles was diese Klasse so kann, sprich VMT/DMT/IntfTable/RTTI/Porperties/Events/Classname/Parentclass usw.

Auch Instanzen heutiger Klassen kann man auf den Stack allozieren, grundsätzlich kann man diese in jeder Art von Speicher allozieren, gleiches gilt für Objekte.
Und wenn der Compiler es unterstützen würde so könnte dieser auch Instanzen alloziert im Stack oder Heap autom. nach Verlassen der Scope wieder freigeben. All dies sind keine Merkmale von Klassen/Objekten oder OOP im speziellen sondern nur Merkmale inwieweit der Compiler nahtlos die OOP unterstützt.
Die alleinige Allozerbarkeit von Objekten in einem Stack widerspricht der OOP und ist unlogisch, da so die Lebenszeit einer jeden Objektinstanz immer nur lokal zur Scope der Funktion die den Stack einrichtet, beschränkt wäre. Somit musste man von Anfang an in der Lage sein Instanzen auch im Heap zu allozieren, gerade auch bei den alten Objekten, damit deren Lebenszeit unabhängig eines Stacks ist. Die Allokation von Objekten auf dem Stack ist auch keineswegs ein Vorteil. Nur weil der Compiler die implizite Freigabe solcher Objekte mit der Freigabe des lokalen Stacks uterstützt heist dies nicht das dies nun ein gewolltes Feature der Borland Entwickler war, eher ein notwendiges Übel und quasi eine Schallmauer die nur durch Allokationen im Heap durchbrochen werden konnte. Das hat auch nichts mit Garbarge Collection zu tuen, es sei denn man gibt dem Kinde "Stack" und dessen Funktionsweise lokale Resourcen beim Verlassen einer Procedure autom. wieder freigeben zu können, diesen Namen. Übrigens ebenfalls eine Erfindung unseres geehrten N.Wirths, der diese Form der Stackbehandlung als erstes in Pascal eingebaut hatte.

Zitat:
Ist aber eigentlich mächtiger als Klassen. Objects ähneln C++-Klassen: Du kannst sie sowohl auf dem Stack als auch auf dem Heap anlegen, es gibt Vererbung, virtuelle Methoden...
Nicht im entferntesten mächtiger, wenn man Klassen und Objekte überhaupt miteinander vergleichen kann. Klassen sind keine Objekte sondern eine Arbeitsvorlage für Objekte. Aus einer Klasse kann man zur Laufzeit sehr viele Instanzen/Objekte erzeugen, alle mit gleichen Klasseneigenschaften aber denoch individuell über ihre unterschiedlichen Feldinhalte.

Die Allozierbarkeit von Objekten aus Klassen ist nicht nur auf den Heap beschränkt. Überschreibt man für eine Klasse die .InitInstance und .FreeInstance Methoden dan kann man die Instazen/Objekte dieser Klasse in jedem beliebigen Speichermedium allozieren, also auch im Stack. Nur ist dies eben kein Vorteil auch wenn es C++ so macht was ja nur eine komfortablere Makroassemblersprache darstellt und keine echte Hochsprache da sind wir Delphianer doch wohl einer Meinung oder ?
[edit]
und wer sagt das Pascal Objekte denen im C++ ähneln, falsch, C++ Objekte ähneln denen vom Pascal... denn das hatte das früher
[/edit]

Gruß Hagen
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#19

Re: Was ist ein Objekt ?

  Alt 29. Jul 2008, 00:50
Moment, Moment mal. Ist wieder mal echt lustig.

Bei mir gibts das für D7 :

Delphi-Quellcode:
type

  TAusgObject = class(TObject)
    Feld1 : integer;
    constructor Create;
    destructor Destroy;
  end;
für BP7 (könnte sogar TP 5.5 sein) gabs so etwas :

Delphi-Quellcode:
ArtElementTyp = OBJECT (FensterTyp)
  Feld1 : integer;
  CONSTRUCTOR init (x1,y1,x2,y2,TextCol : byte);
(* Destructor entfällt wegen Vererbung, bereits in Grundtyp enthalten *)
END;
Also so ähnlich, wie mkinzler sagt. Und Teebee hat auch Recht, denn Markus hat tatsächlich vergessen, dass es ab TP 5.5 OOP gab und somit auch Constructor etc. Gucke dir lieber mal Kram wie inherited, override, protected etc. an.

Oh je, was hat denn Hagen da noch geschrieben ? Nene jetzt nicht mehr.

P.S.: Doch : Neugier hat gesiegt. Meine Antwort bezog sich nur auf Seite 1. Seite 2 übersehen. 8) Es ging damals bei der OOP auch um die Speicherverwaltung. Man hatte nur 640 kb also 640.000 Bytes (mehr nicht !!) Hauptspeicher, der Rest wurde dann provisorisch mit Protected Mode etc. irgendwie provisorisch gemanaged. Vermute stark, dass die für Win95 (war das D2 ?) alles umändern mussten und genau deswegen die Class eingeführt haben. Rest : siehe Hagen. @Fragesteller : warum interessiert dich das eigentlich ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Was ist ein Objekt ?

  Alt 29. Jul 2008, 10:45
Nein war definitiv nicht der Grund.

Delphi-Quellcode:
type
  TMyClass = object(TObject)
definiert eben nicht den Typ eines neuen Objectes sondern eine Klasse von Objekten, aus Sicht der OOP. Klasse deshalb weil es die Vorfahrklasse mit erstmal einer Unterklasse erweitert und diese Unterklasse TMyClass kann selber als Vorfahr für eine ganze Klassenhierarchie dienen. Nicht Objekte. Erst zur Laufzeit erzeugen wir diese Objekte, als Instanzen einer Klasse.

Nun gelten OOP regeln nicht nur auf die fertigen Objekte, also Laufzeitobjekte, sondern schon bei der Typdefinition in der OOP gelten auch die Regeln der OOP. Um diesen Unterschied deutlich zu machen wurde syntaktisch durch Borland nachgebessert

Delphi-Quellcode:
type
  TMyClass = class(TObject);
TMyClass ist eine abgeleitete Klasse von der Klasse TObjekt, und dies wird hier ganz klar auch im Source deutlich. Von TMyClass kann man, muß aber nicht, zur Laufzeit nun Objekte, also Instanzen erzeugen. Der Fakt das eine solche Typdeklaration einer Klasse auch abstrakt sein kann, quasi nur eine Klasse von der man niemals echte Laufzeitobjekte erzeugen wird, zb. TCustomControl etc. pp. in der VCL, zeigt auch sehr deutlich das man die Regeln der OOP auch, bzw. gerade besonders, bei den Typdeklarationen anwendet. Man deklaraiert also nicht mehr nur einen zb. type MyInteger = Integer, sondern man Deklariert ganze Strukturen von zueinander abhängigen und immer weiter verfeinerten Klassenhierarchien und schon während dieser Typdeklaration von Nachfahren kann der Compiler assistieren, Fehler prüfen usw. Mit dem class Bezeichner hat Borland die Sache nur syntaktisch sauberer gemacht.

Weiter gehts mit dem class of

Delphi-Quellcode:
type
  TDECCipher = class(TDECObject)
  end;
  
  TCipher_AES = class(TDECipher);
  TCipher_Blowfish = class(TDECCipher);

  TDECCipherClass = class of TDECObject;

procedure MakeSomeThing(const ADECClass: TDECCipherClass);
var
  Cipher: TDECCipher;
begin
  Cipher := ADECClass.Create;
  try
    Cipher.BlaBla;
  finally
    Cipher.Free;
  end;
end;

procedure Test;
begin
  MakeSomeThing(TCipher_AES);
  MakeSomeThing(TCipher_Blowfish);
end;
Man kann wie oben gezeigt eine Klasse auch als Variable/Parameter, eg. dynamisch zu Laufzeit benutzen. Man kann auch mit diesen Klassenvariablen, andere meinen sie als "Metaklassen" zu bezeichnen, so arbeiten das selbst die Übergabe von Klassen zur letzendlichen Erzeugung von Instanzen, gewissen OOP Regeln unterliegen. zb. wird dies benutzt um die Polymorphie der Objektinstanzen auch auf die Klassenhierarchien auszudehenen. Erst dadurch werden zb. die DFMs Streams, also das VCL Streaming System, überhaupt erst möglich.

All diese neuen Features hätte man auch in die, bzw. genauer um die, bestehenden alten Objekte bauen können und diese dann zu den heutigen Klassen ausbauen können. Genauergesagt hat dies Borland sogar exakt so gemacht. Die Klassenrecords im Codesegement, die also eine Klasse beschreiben, bestehen ab Offset 0 aus den gleichen Daten wie bei den alten Objekten. Vor dem Offset 0, also mit negativen Offsets stehen bei Klassen aber nun noch mehr Sachen. Borland hat also die alten Objekte aufgebohrt zu Klassen. Innerhalb der Klassenrecords wurde das neue Feature -> RTTI -> auch noch angewendet, so das dieses ehemals nicht OOP Feature heutzutage eben eine Grundlage der OOP darstellt, um zb. neuere Möglichkeiten der Klassen, wie Properties usw. unterstützen zu können.

Im gleichen Atemzug hat Borland nun auch die Syntax geändert, was schlußendlich auch das Hauptziel war. Die Syntax mit den Klassen spiegelt einfach die OOP besser und leichter verständlich wieder. Sie trennt zwei wichtige Aspekte der OOP auch syntaktisch deutlich, die Deklaration von Typen der OOP also einer Klassenhierarchie und deren Benutzung zur Laufzeit als Instanzen=Objekten dieser Klassenhierarchie. Der Bezeichner object macht dies eben nicht deutlich, bzw. ist im Sinne der OOP ein falscher Name für einen Bezeichner der eine Klassenhierarchie deklariert.

Mit dem Speichermanegement hat dies im Grunde nichts zu tuen. Man kann Instanzen zur Laufzeit beliebig allozieren, im Stack oder Hauptspeicher, ist egal. Man kann auch die Klassenrecords durch den Compiler an beliebiger Stelle abspeichern, muß also nicht wie in Delphi im Codesegment liegen, was aber sinnvoll ist. Eine Klasse lässt sich auch im Stack oder Heap dynamisch zusammenschustern zur Laufzeit. Diese Möglichkeit habe ich benutzt um zur Laufzeit aktiv das Verhalten einer Klasse, und damit all derer Instanzen, zu beeinflussen.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz