Seite 1 von 1

HIDDEN vs. PROTECT [erledigt]

Verfasst: Do, 17. Sep 2015 9:27
von AUGE_OHR
hi,

ich habe in meiner DXE LIB "aufgeräumt" und die internen Methoden umdeklariert von EXPORTED nach PROTECT.
Es ging mir darum das die "internen" Methoden nicht vom User genutzt werden sollten ... auch nicht wenn er eine Sub Class erstellt !

nun steht unter PROTECT
Die Member-Variablen und Methoden, welche nach PROTECTED: deklariert sind, sind nur innerhalb des Programmcodes für die Methoden der deklarierten Klasse und ihrer zukünftigen Subklassen sichtbar und können nur innerhalb von diesen Methoden benutzt werden.
Frage : bedeutet das, mit Sub Classing, die PROTECT Methoden "sichtbar" werden ?

nun gibt es ja noch HIDDEN
Die Member-Variablen und Methoden, welche nach HIDDEN: deklariert sind, sind nur innerhalb des Programmcodes für die Methoden der deklarierten Klasse sichtbar und können nur innerhalb von diesen Methoden abgefragt bzw. aufgerufen werden.
Sie sind weder in Subklassen noch im restlichen Programm sichtbar.
Frage : wäre also HIDDEN noch restriktiver als PROTECT ?

nun habe ich mir den Demo Code angesehen

Code: Alles auswählen

    CLASS classA 
      VAR varA                         // Sichtbarkeit ist HIDDEN: 
 
      EXPORTED: 
      VAR varB, varC                   // Global sichtbar 
      METHOD methodA, methodB 
 
      HIDDEN: 
      VAR varD, varE                   // Nur in Methoden von ClassA 
      METHOD methodC, methodD          // sichtbar 

    ENDCLASS 
Frage : wieso wurde "varA" nicht unter HIDDEN plaziert ... wenn es doch HIDDEN sein soll ?

Re: HIDDEN vs. PROTECT

Verfasst: Do, 17. Sep 2015 11:27
von brandelh

Code: Alles auswählen

Frage : bedeutet das, mit Sub Classing, die PROTECT Methoden "sichtbar" werden ?
genau das bedeutet das, wenn man möchte dass die OBJEKTE von außen eine Mehtode nicht nutzen können, aber in der (abgeleiten) die Methoden genutzt werden sollen, dann ist PROTECT die richtige Auswahl.

Wenn du willst, dass NIEMAND diese nutzen kann - für interne Sachen sicher ab und an sinnvoll - dann nutzt man HIDDEN ...

Warum dies unten HIDDEN ist, wenn NIX dasteht ... schauen wir ins Handbuch:
Handbuch hat geschrieben:Wenn kein allgemeines Sichtbarkeitsattribut angegeben ist, werden alle Member-Variablen und Methoden standardmäßig als HIDDEN: angelegt,
d.h. sie sind außerhalb des Programmcodes von Methoden der Klasse nicht sichtbar.
das Beispiel stimmt, da HIDDEN der DEFAULT Wert ist.

Re: HIDDEN vs. PROTECT

Verfasst: Do, 17. Sep 2015 13:20
von Tom
HIDDEN bedeutet nach meinem Dafürhalten, dass Methoden und Variablen protected sind und zugleich nicht vererbt werden. Methoden mit diesem Attribut können also innerhalb des Codes der Superklasse selbst verwendet werden, nicht jedoch von außen (oObject:MachWas() schlägt fehl, aber ::MachWas im Klassencode geht), aber im Code der abgeleiteten Klasse gibt es sie schlicht überhaupt nicht.

Re: HIDDEN vs. PROTECT

Verfasst: Do, 17. Sep 2015 14:36
von brandelh
Tom hat geschrieben:HIDDEN bedeutet nach meinem Dafürhalten, dass Methoden und Variablen protected sind und zugleich nicht vererbt werden.
das ist eine gute Frage ... ob versteckt oder nicht, kann man in einer abgeleiteten Klasse eine neue "Protected" Methode / Objekt neu anlegen,
das den gleichen Namen wie eine HIDDEN Methode/var der darüberliegenden hat ... ?

Wenn JA, dann hat Tom recht und sie wurde gar nicht weitervererbt,
Wenn Nein, dann wird sie zwar vererbt, ist aber unsichtbar ;-)

Re: HIDDEN vs. PROTECT

Verfasst: Do, 17. Sep 2015 14:50
von Tom
Sie wäre aber dennoch weiterhin in der Superklasse verfügbar. Ruft man also in der abgeleiteten Klasse eine Methode der Superklasse auf, die eine HIDDEN-Methode der Superklasse aufruft, müsste das gehen.

Re: HIDDEN vs. PROTECT

Verfasst: Sa, 19. Sep 2015 3:27
von AUGE_OHR
hi,

Danke euch das ihr es noch mal klar gestellt habt wozu HIDDEN verwendet werden soll.

es geht mir bei HIDDEN weniger darum den Anwender "einzuschränken" als darum "aufzuräumen" was der User tatsächlich braucht.
was übrig bleibt sind die EXPORTED: welche ich dann dokumentieren muss ;)