Kapitel 7.3 Zugreifbarkeit Korbinian Molitorisz IPD Tichy Lehrstuhl für Programmiersysteme KIT die Kooperation von Forschungszentrum Karlsruhe GmbH und Universität Karlsruhe (TH)
Zugreifbarkeit (Accessibility) Typen, Namensräume, die Elemente einer Klasse und vieles mehr unterliegt einem vom Compiler sichergestellten Zugriffsschutz Alle Elemente haben eine (kontextabhängige) Standard-Zugreifbarkeit Modifikator public protected internal protected internal private Bedeutung Access not limited Access limited to the containing class or types derived from the containing class Access limited to this program Access limited to this program or types derived from the containing class Access limited to the containing type Beachte: Zugreifbarkeit Sichtbarkeit! 2
Zugreifbarkeitsdomänen (ZD) Def.: Eine Zugreifbarkeitsdomäne einer Deklaration umfasst die Teile des gesamten Quellcodes, aus denen ein Zugriff auf diese Deklaration zulässig ist. Beispiel: Die ZD der vordefinierten Typen object und int ist unbeschränkt, es darf also von überall aus darauf zugegriffen werden. Für die Angabe der ZD benötigen wir folgende Definition: Ein Element befindet sich auf oberster Ebene (top level), wenn es nicht innerhalb eines Typs deklariert ist. Das ist i.d.r. ein Typ (z.b. eine Klasse) direkt in einem Namensraum. Erinnerung: Typen müssen nicht in Namensräumen deklariert werden! Ein Element wird als untergeordnet (nested) bezeichnet, wenn es innerhalb eines Typs deklariert ist. 3
Zugreifbarkeitsmodifikatoren Ein Typ auf oberster Ebene kann nur public oder internal sein. Die ZD eines Typs T auf oberster Ebene, der in einem Programm P definiert wird, ist: Bei public: die ZD von T ist der gesamte Quellcode von P und der Quellcode jedes Programms, das P verwendet. Bei internal: die ZD von T ist der gesamte Quellcode von P. 4
Beispiel Programm A Programm B public class P internal struct Q (nichts) interface R internal enum S Überall in A darf auf P und Q zugegriffen werden Überall in B darf auf P, R und S zugegriffen werden 5
Zugreifbarkeitsmodifikatoren Die ZD eines untergeordneten Elementes E*, definiert im Kontext des Typ T, der in einem Programm P definiert wird, ist wie folgt festgelegt: Ist E public, dann ist die ZD von E die von T. Programm P ZD(E) = ZD(T) Typ T public Element E * Hinweis: E könnte selbst auch ein Typ sein! 6
Zugreifbarkeitsmodifikatoren Die ZD eines untergeordneten Elementes E, definiert im Kontext des Typ T, der in einem Programm P definiert wird, ist wie folgt festgelegt: Ist E private, dann ist die ZD von E der Quellcode von T. Programm P ZD(E) = T Typ T private Element E 7
Zugreifbarkeitsmodifikatoren Die ZD eines untergeordneten Elementes E, definiert im Kontext des Typ T, der in einem Programm P definiert wird, ist wie folgt festgelegt: Ist E internal, dann ist die ZD von E der Schnitt der ZD von T mit dem Quelltext von P. Programm P ZD(E) = ZD(T) P Typ T internal Element E 8
Zugreifbarkeitsmodifikatoren Die ZD eines untergeordneten Elementes E, definiert im Kontext des Typ T, der in einem Programm P definiert wird, ist wie folgt festgelegt: Ist E protected, dann ist die ZD der Schnitt der ZD von T mit der Vereinigung des Quellcodes von T und jedem von T abgeleiteten Quellcode. Programm P ZD(E) = ZD(T) (T T ) Typ T protected Element E Typ T 9
Zugreifbarkeitsmodifikatoren Die ZD eines untergeordneten Elementes E, definiert im Kontext des Typ T, der in einem Programm P definiert wird, ist wie folgt festgelegt: Ist E protected internal, dann ist die ZD der Schnitt der ZD von T mit der Vereinigung des Quellcodes von P und jedem von T abgeleiteten Quellcode T. Programm P Typ T protected internal Element E ZD(E) = ZD(T) (P T ) Typ T Hinweis: T P 10
Einschränkungen und Standards der Zugreifbarkeitsfestlegung Namensräume sind implizit public. Dies kann nicht verändert werden. Typen auf oberster Ebene sind implizit internal. Sie dürfen als public oder internal deklariert werden. Die Elemente einer Klasse sind implizit private. Die Elemente einer Struktur sind implizit private. Sie dürfen als public, internal oder private deklariert werden. Die Elemente von Schnittstellen sind implizit public. Dies kann nicht verändert werden. Die Elemente von Aufzählungstypen sind implizit public. Dies kann nicht verändert werden. 11
Folgerungen Die ZD eines Typs auf oberster Ebene ist immer mindestens das Programm in dem er definiert wurde. Die ZD eines untergeordneten Elements ist immer mindestens der Quelltext des Typs, in dem das Element deklariert wurde. Die ZD eines untergeordneten Elements ist nie größer als die des umgebenden Typs (Schnittbildung!). 12
Übung public class A { internal class B { public class C { private class D { Wer darf zugreifen? Jeder Quelltext Nur der Quelltext des Programms, in dem die beiden Klassen deklariert wurden Nur der Quelltext von A Nur der Quelltext von B (beinhaltet den Quelltext von B.C und B.D!) Nur der Quelltext von B.C Nur der Quelltext von B.D 13
Hilfe Die ZD eines untergeordneten Elementes E*, definiert im Kontext des Typ T, der in einem Programm P definiert wird, ist wie folgt festgelegt: Ist E public, dann ist die ZD von E die von T. Ist E private, dann ist die ZD von E der Quellcode von T. Ist E internal, dann ist die ZD von E der Schnitt der ZD von T mit dem Quelltext von P. Ist E protected, dann ist die ZD der Schnitt der ZD von T mit der Vereinigung des Quellcodes von T und jedem von T abgeleiteten Quellcode. Ist E protected internal, dann ist die ZD der Schnitt der ZD von T mit der Vereinigung des Quellcodes von P und jedem von T abgeleiteten Quellcode T. 14
Lösung public class A { internal class B { public class C { private class D { Wer darf zugreifen? Jeder Quelltext Nur der Quelltext des Programms, in dem die beiden Klassen deklariert wurden Nur der Quelltext von A Nur der Quelltext von B (beinhaltet den Quelltext von B.C und B.D!) Nur der Quelltext von B.C Nur der Quelltext von B.D 15