![]() |
Fragen zu OOP und Klassen: published, protected, ...
Weiter in Verständnisfragen zu Klassen: private, public, published und protected
Siehe auch vorherige Verständnisfragen: ![]() 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:
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? |
Re: Fragen zu OOP und Klassen: published, protected, ...
Zitat:
Delphi-Quellcode:
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.TMyObject = class(TObject) private FFeld: EinTyp; public property FNurHierDeklariertAberInAllenNachfahrenTrotzdemVorhanden: EinTyp read FFeld write FFEld; end; TMyAnderesObj = class(TMyObject) private FEinFeld: NochEinType; end; |
Re: Fragen zu OOP und Klassen: published, protected, ...
Zitat:
Delphi-Quellcode:
Das geht auch so
TMeineKlasse = class
private FFeld1: String; private FFeld2: String; private FFeld3: String; private FFeld4: String; end;
Delphi-Quellcode:
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elementes in der Deklaration. Das ist üblicher
TMeineKlasse = class
private FFeld1: String; FFeld2: String; FFeld3: String; FFeld4: String; end;
Delphi-Quellcode:
Es geht bei dem Satz oben nur um die Sichtbarkeitsattribute. Muß man erst drauf kommen. Ist glaube ich aus der Delphihilfe.
TMeineKlasse = class
private FFeld1: String; FFeld2: String; FFeld3: String; FFeld4: String; end; |
Re: Fragen zu OOP und Klassen: published, protected, ...
Zitat:
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. |
Re: Fragen zu OOP und Klassen: published, protected, ...
Interessante Ausführung
Zitat:
Zitat:
Zitat:
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? |
Re: Fragen zu OOP und Klassen: published, protected, ...
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:
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.
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; |
Re: Fragen zu OOP und Klassen: published, protected, ...
Hm, also ich dachte, das wäre in meinem Tutorial deutlich geworden. :gruebel:
|
Re: Fragen zu OOP und Klassen: published, protected, ...
Ich häng mich mal ganz kurz mit ran:
Was ist mit den Deklarationen, die ohne Attribut angelegt werden? z.B.
Delphi-Quellcode:
"fCreated" steht jetzt direkt unterhalb der Klassenableitung, wie wird das behandelt?
TMyClass = class
fCreated: TDateTime; protected function getCreated:TDateTime; public constructor Create(); end; |
Re: Fragen zu OOP und Klassen: published, protected, ...
Zitat:
...nimm mal eine Form, packe einfach paar Komponenten drauf und schau mal wo sie in der Form-Klasse eingefügt werden |
Re: Fragen zu OOP und Klassen: published, protected, ...
Nein, nicht explizit. Es kann published oder auch public sein!
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 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