AGB  ·  Datenschutz  ·  Impressum  







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

Public/Private Deklarationen

Ein Thema von thomasdrewermann · begonnen am 17. Sep 2002 · letzter Beitrag vom 18. Sep 2002
Antwort Antwort
Benutzerbild von thomasdrewermann
thomasdrewermann

Registriert seit: 8. Jun 2002
Ort: Herne
575 Beiträge
 
Delphi 3 Professional
 
#1

Public/Private Deklarationen

  Alt 17. Sep 2002, 22:38
Was ist der Unterschied zwischen Private Deklarationen und Public Deklarationen?

Code:
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
MFG
Thomas
Sport ist mord...
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#2
  Alt 17. Sep 2002, 22:57
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 17. Sep 2002, 23: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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 17. Sep 2002, 23:07
Moin Daniel B,

Zitat:
wenn Du sie unter Public schreibst, dann verschwendest Du Resourcen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 18. Sep 2002, 09: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 W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:12 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