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?