AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fragen zu OOP und Klassen: published, protected, ...
Thema durchsuchen
Ansicht
Themen-Optionen

Fragen zu OOP und Klassen: published, protected, ...

Ein Thema von Gonzo2 · begonnen am 23. Nov 2007 · letzter Beitrag vom 19. Dez 2007
Antwort Antwort
Seite 1 von 3  1 23      
Gonzo2

Registriert seit: 4. Nov 2007
42 Beiträge
 
#1

Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 09:37
Weiter in Verständnisfragen zu Klassen: private, public, published und protected

Siehe auch vorherige Verständnisfragen: Fragen zu inherited

Kommen wir zu private, public, published und protected. Einige der Attribute sind in Bedeutung bekannt, vor allem private und public, da sie unter anderem aus der Arbeit mit Formularen bekannt sind. Sie steuern ob Elemente nur innerhalb der aktuellen oder auch in anderen Units bekannt sind. Neu beim Erstellen von eigenen Klassen sind published und protected Attribute. Außerdem ist mir nicht ganz klar welche Vorteile es mir bringt etwas in public zu packen wenn es auch ohne ein Attribut funktioniert. Aber gehen wir die Punkte einzeln durch.

private: hier sind Felder und Methoden innerhalb der eigenen Unit sichtbar. private schützt also nicht in der eigenen Unit vor Zugriffen. Aus klassenfremden Prozeduren und Funktionen kann in der eigenen Unit auch auf Inhalte von private zugegriffen werden. Anders sieht es bei einer fremden Unit aus. Hier sind die Inhalte von private unsichtbar. Beim Zugriff gibt es eine Fehlermeldung.

public: hier sind Felder und Methoden innerhalb der eigenen und fremden Unit sichtbar. Bei public kann man innerhalb der eigenen Klasse, fremden Klasse, eigenen Unit und fremden Unit zugegriffen werden.

Bei published können anscheinend keine Felder deklariert werden. Es gibt eine Fehlermeldung. Bei protected kann man Felder deklarieren. Bei published kann man eine property (Eigenschaft) definieren die in eigener und fremden Unit abrufbar ist. Eine property kann man aber auch unter private, public, published und protected definieren. Bei protected ist eine property in einer fremden Unit nicht sichtbar. Verwende ich kein Sichtbarkeitsattribute am Anfang einer Klassendeklaration, ist mein Element in der eigenen und fremden Unit abrufbar.

Etwas Kopfzerbrechen bereitete mir eine kurze Zeit dieser Satz aus der Hilfe:
Zitat:
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elementes in der Deklaration
Bis ich rausgefunden habe, daß private, public, published und protected keine Bereiche sind, sondern vor jedes Feld, Prozedur, Funktion, Property usw. vorangestellt werden können. Man kann sich das aber sparen und es nur vor das erste Element stellen. Alle folgende Elemente erhalten dann das Attribut des vorhergehenden Elements. Aber da muß man erst drauf kommen. Vor allem weil private, public, published und protected in automatisch erstellten Units so angeordnet sind als ob sie Bereiche bilden würden. Diese Information ist definitiv zuviel des Guten. Sie verwirrt mehr als sie informiert.

Soviel habe ich schon zu den Sichtbarkeitsattributen selbst rausgefunden. Das einzige was mehr oder weniger klar ist, sind private und public. Irgendwo habe ich gelesen, daß Elemente am Anfang einer Klassendeklaration ohne Sichtbarkeitsattribute published bzw. public deklariert werden. Dann frage ich mich aber wann was genommen wird. Wäre es public, könnte ich es verstehen, aber published bzw. public sind zwei Möglichkeit. Wenn ich also ein Element an den Anfang stelle, was ist es dann? published oder public? Wann ist es was? Und wozu etwas dann in public stellen wenn es auch ohne geht. Nur wegen der Übersicht?

Dann sind mir noch published und protected nicht ganz klar, bis auf die Punkte die ich oben erwähnt habe. In Büchern und Tutorials steht, daß publisched Methoden Laufzeitinformationen für den Objektinspektor erhalten. Das verstehe ich jetzt nicht genau. Erstens benutze ich bei Klassen doch keinen Objektinspektor, nur bei Komponenten, und zweitens welche Informationen sind das und wozu dienen sie? Bei protected steht, daß es wie private ist, nur daß der Zugriff auf Methoden hinter protected nur aus der eigenen Klasse oder über Methoden der Nachfolger erfolgen kann, die nicht unbedingt aus der eigenen Unit erfolgen müssen. Wie ist das zu verstehen?
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 09:50
Zitat von Gonzo2:
Etwas Kopfzerbrechen bereitete mir eine kurze Zeit dieser Satz aus der Hilfe:
Zitat:
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elementes in der Deklaration
Ok ein Beispiel dazu:

Delphi-Quellcode:

 TMyObject = class(TObject)
   private
     FFeld: EinTyp;
   public
    property FNurHierDeklariertAberInAllenNachfahrenTrotzdemVorhanden: EinTyp read FFeld write FFEld;
   
  end;
  
  TMyAnderesObj = class(TMyObject)
   private
    FEinFeld: NochEinType;
  end;
Auch wenn in der zweiten Klasse die public property nicht explizit definiert ist, kannst du über ein Objekt der zweiten Klasse auf diese property zugreifen, da sie diese property vom Vorfahren erbt.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Gonzo2

Registriert seit: 4. Nov 2007
42 Beiträge
 
#3

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 10:03
Zitat von Tyrael Y.:
Zitat von Gonzo2:
Etwas Kopfzerbrechen bereitete mir eine kurze Zeit dieser Satz aus der Hilfe:
Zitat:
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elementes in der Deklaration
Ok ein Beispiel dazu:
Siehst Du, der Satz verwirrt, auch dich. Ich brauchte auch paar Minuten um zu merken was hier gemeint ist. Es hat nichts mit erben zu tun. Gemeint ist das hier

Delphi-Quellcode:
  TMeineKlasse = class
  private FFeld1: String;
  private FFeld2: String;
  private FFeld3: String;
  private FFeld4: String;
  end;
Das geht auch so

Delphi-Quellcode:
  TMeineKlasse = class
  private FFeld1: String;
          FFeld2: String;
          FFeld3: String;
          FFeld4: String;
  end;
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elementes in der Deklaration. Das ist üblicher

Delphi-Quellcode:
  TMeineKlasse = class
  private
    FFeld1: String;
    FFeld2: String;
    FFeld3: String;
    FFeld4: String;
  end;
Es geht bei dem Satz oben nur um die Sichtbarkeitsattribute. Muß man erst drauf kommen. Ist glaube ich aus der Delphihilfe.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#4

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 10:08
Zitat von Gonzo2:
Dann sind mir noch published und protected nicht ganz klar, bis auf die Punkte die ich oben erwähnt habe.
1.) Private
Nur sichtbar in der eigenen Klasse (und, aber das finde ich persönlich unschön, in anderen Klassen in der gleichen unit).
Eine abgeleitete Klasse kann auf ein private - Element nicht zugreifen.

2.) Protected
Sichtbar in der eigenen Klasse und in davon abgeleiteten Klassen. Eine Klasse kann also auf ein protected Element der Eltern zugreifen.

3.) Public
Klar: Das ist öffentlich, da können auch fremde Klassen drauf zugreifen.

4.) Published
Published = public, und für den Objektinspektor veröffentlicht.
Eigentlich nur dann Sinnig, wenn diese Klasse irgendwie im Objektinspektor verwendet werden soll. Published - Eigenschaften kann man eben dann im Objektinspektor verändern, 'nur' public Eigenschaften nicht.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Gonzo2

Registriert seit: 4. Nov 2007
42 Beiträge
 
#5

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 10:45
Interessante Ausführung

Zitat von Phoenix:
1.) Private
Nur sichtbar in der eigenen Klasse (und, aber das finde ich persönlich unschön, in anderen Klassen in der gleichen unit).
Eine abgeleitete Klasse kann auf ein private - Element nicht zugreifen.

2.) Protected
Sichtbar in der eigenen Klasse und in davon abgeleiteten Klassen. Eine Klasse kann also auf ein protected Element der Eltern zugreifen.
Kann ich das jetzt so zusammenfassen, daß der Unterschied zwischen private und protected der ist, daß alles aus private nicht geerbt werden kann und erst mit protected, soweit es sich um nicht öffentliche Elemente handelt, das System der Vererbung greift? Aus private wird nichts geerbt, aus protected wird geerbt? Somit kann ich steuern was mein Nachfahre erben kann und was nicht?

Zitat:
3.) Public
Klar: Das ist öffentlich, da können auch fremde Klassen drauf zugreifen.
Das ist soweit klar. Da hier die Elemente sowieso sichtbar sind, kann hier nichts oder kaum gesteuert werden.

Zitat:
4.) Published
Published = public, und für den Objektinspektor veröffentlicht.
Eigentlich nur dann Sinnig, wenn diese Klasse irgendwie im Objektinspektor verwendet werden soll. Published - Eigenschaften kann man eben dann im Objektinspektor verändern, 'nur' public Eigenschaften nicht.
Der Punkt ist mir noch nicht ganz klar. Ich verstehe das irgendwie mit dem Objektinspektor, aber sehe nicht den großen Sinn darin, da Klassen nicht den OI nutzen. Außer, daß ist im Zusammenhang mit Komponenten gemeint. Komponenten nutzen auch Klassen. Hinter Items von ListBox steht die Klasse TStrings. Somit würde das Ganze wieder einen Sinn ergeben, da hier eine Klasse im Objektinspektor angezeigt wird.

Was mir aber noch nicht ganz klar ist, inwieweit können die published Eigenschaften im OI verändert werden und public nicht? Werden die public Eigenschaften nicht gezeigt oder können sie nicht verändert werden oder fehlen da einige Informationen?

Ich glaube das mit public und published jetzt zumindest ansatzweise verstanden zu haben, aber beherrschen tue ich es noch nicht. Was passiert wenn Items von ListBox public und nicht published ist?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#6

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 10:51
Genau: Das ist hauptsächlich für Komponenten interessant bzw. für Klassen, die von Komponenten verwendet werden.
Public werden im OI nicht angezeigt, Published eben schon.

Zu private / protected:
Es wird logischerweise beides vererbt. Aber die abgeleitete Klasse kann nicht direkt auf die private Elemente zugreifen.

Beispiel:
Delphi-Quellcode:
TMyClass = class
private
  fCreated: TDateTime;
protected
  function getCreated:TDateTime;
public
  constructor Create();
end;

constructor TMyClass.Create();
begin
  fCreated := now;
end;

function TMyClass.getCreated:TDateTime;
begin
  result := fCreated;
end;
In jeder abgeleiteten KLasse kannst Du auf getCreated zugreifen und bekommst das Datum der Erstellung. Das Feld fCreated wird also mit vererbt. Du kannst aber NICHT auf fCreated einen anderen Wert zuweisen.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 11:07
Hm, also ich dachte, das wäre in meinem Tutorial deutlich geworden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#8

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 11:16
Ich häng mich mal ganz kurz mit ran:

Was ist mit den Deklarationen, die ohne Attribut angelegt werden?

z.B.
Delphi-Quellcode:
TMyClass = class
  fCreated: TDateTime;
protected
  function getCreated:TDateTime;
public
  constructor Create();
end;
"fCreated" steht jetzt direkt unterhalb der Klassenableitung, wie wird das behandelt?
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 11:24
Zitat von guidok:
Ich häng mich mal ganz kurz mit ran:

Was ist mit den Deklarationen, die ohne Attribut angelegt werden?

z.B.
Delphi-Quellcode:
TMyClass = class
  fCreated: TDateTime;
protected
  function getCreated:TDateTime;
public
  constructor Create();
end;
"fCreated" steht jetzt direkt unterhalb der Klassenableitung, wie wird das behandelt?
...es wird als published angesehen

...nimm mal eine Form, packe einfach paar Komponenten drauf und schau mal wo sie in der Form-Klasse eingefügt werden
Levent Yildirim
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 11:27
Nein, nicht explizit. Es kann published oder auch public sein!

Zitat von Delphi Hilfe:
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elements in der Deklaration. Die Elemente am Anfang einer Klassendeklaration ohne explizite Sichtbarkeitsangabe werden standardmäßig als published deklariert, wenn die Klasse im Status {$M+} compiliert oder von einer mit {$M+} compilierten Klasse abgeleitet wurde. Andernfalls erhalten sie das Attribut public.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 20:23 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