Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#5
  Alt 18. Sep 2002, 10:02
Mal eine kurze Aufklärung zu Methoden (Procedure, Function) in Klassen und Felder (Variablen) in Klassen - und zum Unterschied zwischen Klasse und Objekt.

Erst einmal kurz Klasse und Object
Eine Klasse (z.B. TForm = class(TCustomForm) beschreit den Aufbau eines Objektes. Die Klasse definiert alle Methoden und Felder, welche durch Objekte dieser Klasse unterstützt werden. Eine Klasse ist sozusagen der "Blueprint" eines Objektes - wie der Bauplan der "Blueprint" eines Hauses ist. Kurz, die Klasse ist der Bauplan, aber noch lange nicht das Haus.

Wenn Du eine Objekt erstellst (z.B. Form := TForm.Create(Self);), dann wird die Klasse (der Bauplan) zugrunde gelegt und das Objekt nach demselbigen erstellt. Später kann anhand der Klassendefinition auf das Objekt zugegriffen werden, da der Compiler immer weiss, an welcher Stelle welche Werte und Methoden zu finden sind.

Die Methoden einer Klasse
Um so wenig Resourcen wie möglich zu verwenden, werden sämtliche Methoden (z.B. Show und Hide von TCustomForm) nur einmal vom Programm in den Speicher geladen, unabhängig davon, wieviele Formulare auf diese Rountinen zugreifen werden. Beim Aufruf der entsprechenden Methode, wird der Methode der Bezug zum entsprechenden Objekt mitgegeben. Das Gleiche gilt natürlich auch für alle anderen Methoden einer Klasse/eines Objektes. Sollte die Methode lokale Variablen benutzen, so wird der dafür beötigte Speicher vor dem Aufruf auf dem Stack reserviert und dann der entsprechenden Methode zugewiesen. Dadurch kommte es nicht zu Konflikten bei gleichzeitigen Aufruf (thread-safe / Gilt wohl seit Delphi 4 für die meisten Klassen der VCL).

Die Felder (Variablen) einer Klasse
Wenn ein neues Objekt erstellt wird (anhand der vorliegenden Klasse), dann wird für alle Klassenvariablen der entsprechend benötigte Speicher reserviert. Dieser Speicher wird der Klasse zugewiesen und kann dann entsprechend genutzt werden. Eine Variable benötigt die gleiche Speichermenge unabhängig davon, ob diese im private, protected, public oder im published Bereich deklariert wird. Nur die Zugriffsregeln werden vom Compiler anders definiert. Mehr dazu einen Moment später.

Zusammfassung der letzten beiden Punkte
Alle Methoden einer Klasse (und den davon abgeleiteten Klassen) werden unabhängig von den initialisierten Objekte genau einmal in den Speicher geladen und zwischen den Objekten "friedlich" geteilt genutzt.

Für jedes Objekt wird der Speicher reserviert, der benötigt wird, um die einzelnen Klassenvariablen (also die verbindlichen Daten) zu speichern. Zusätzlich werden ein paar Byte für das Objektmanagement benötigt.

Und zum Abschluss: die VTable
Für jede Klasse gibt es eine sogenannte VTable. In dieser VTable hinterlegt Delphi, an welcher (relationalen) Stelle im Speicher eine Variable hinterlegt ist. Das geschieht unabhängig von der Sektion (private...), in welcher die Variable deklariert wurde. Am Ende sind alle Variablen gleich.

Warum dann aber private, protected, ...
Um die Eingangsfrage noch einmal aufzugreifen ein abschliessendes Wort zu den Bereichen einer Klasse. Letztendlich sind die Bereiche dazu da, um den Entwickler einer Klasse mehr Kontrolle über die einzelnen Felder (Daten) und Methoden einer Klasse zu geben. Kleines Beispiel anhand des TLabels.

Wenn die Caption eines Labels geändert wird, dann wird automatisch das Label neu gerendert und dargestellt, ohne dass wir dieses dem Label extra sagen müssen (abgesehen von der Ausnahme, dass das Programm mit anderen Dingen beschäftigt ist und die Neudarstellung sich verzögert). Nach aussen ist die Eigenschaft Caption wie eine Variable zu benutzen.

Code:
 verfälschte (zu Erklärungszwecken) Deklarition:
    [b]property[/b] Caption: TCaption [b]read[/b] FCaption [b]write[/b] SetCaption;
Durch die Deklarition wird Caption als eine Eigenschaft (Property) der Klasse TLabel dargestellt. Auf diese Eigenschaft kann von aussen (mit wenigen Ausnahmen) wie auf eine Variable zugegriffen werden.

Wenn wir jetzt dieser Eigenschaft einen Wert übergeben (Label.Caption := 'Neuer Wert'; ), dann wird intern vom Compiler die Prozedur SetCaption aufgerufen und dieser der Wert 'Neuer Wert' übergeben. Dadurch "weiss" das Label, dass seine Caption geändert wurde und kann auch sofort veranlassen, dass es sich selbst neu darstellt.

Ich hoffe, dass das einen kleinen Einblick in die Arbeit von Klassen in Delphi gibt.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat