Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Public/Private Deklarationen (https://www.delphipraxis.net/871-public-private-deklarationen.html)

thomasdrewermann 17. Sep 2002 23:38


Public/Private Deklarationen
 
Was ist der Unterschied zwischen Private Deklarationen und Public Deklarationen?

Code:
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
MFG
Thomas

Daniel B 17. Sep 2002 23:57

:hi: Thomas,

Prozeduren die in Public aufgelistet sind, sind in allen Units bekannt, stehen bzw. zur Verf.
Die unter Private, nur in der jeweiligen Unit.
Wenn du also eine Prozedur nur in Unit1 brauchst, dann schreibe sie auch lieber unter private, wenn Du sie unter Public schreibst, dann verschwendest Du Resourcen.

Grüsse, Daniel :hi:

Christian Seehase 18. Sep 2002 00:06

Moin Thomas,

dann mal vollständig:

Es gibt vier Sichtbarkeitsstufen:

private / geringste Sichtbarkeit
Auf das, was in diesem Abschnitt deklariert wird kann nur innerhalb der Unit zugegriffen werden, in der die Deklaration steht.
In abgeleiteten Klassen besteht kein Zugriff (wenn sie nicht in der gleichen Unit deklariert werden)

protected / mittlere Sichtbarkeit
Es kann nur innerhalb der Klassendeklaration und davon abgeleiteter Klassen auf diese Einträge zugegriffen werden.

public / Hohe Sichtbarkeit
auf das, was hier deklariert wird kann von überall her zugegriffen werden, von wo aus auf eine Variable des Typs zugegriffen werden kann.

published / Hohe Sichtbarkeit
Wohl nur sinnvoll bei Komponenten einsetzbar.
Im Prinzip wie public, nur dass diese Einträge im Objektinspektor erscheinen und eingestellt werden können.

Damit sich private und protected auswirken können, sollten die Klassendeklarationen in einer separaten Unit stehen, denn innerhalb der Unit in der die Deklaration steht, kann auf diese Felder/Methoden dennoch zugegriffen werden.


[EDIT]published ist Borland spezifisch, die anderen drei wirst Du so auch in VC++ finden[/EDIT]

Christian Seehase 18. Sep 2002 00:07

Moin Daniel B,

Zitat:

wenn Du sie unter Public schreibst, dann verschwendest Du Resourcen.
:?:

sakura 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.

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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