Kapitel 8 Zugriff auf Klassenmitglieder
Eine der wichtigen Entscheidungen beim Objektentwurf
ist die, in welchem Maße die Mitglieder einer Klasse auf das Objekt
zugreifen können. In C# kann der Zugriff auf verschiedene Arten
gesteuert werden.
8.1 Klassenzugriff
 
Die Zugriffssteuerung auf Klassenebene stellt die gröbste Art der
Steuerung dar. In den meisten Fällen sind die einzigen zulässigen
Modifikatoren für eine Klasse public (die Klasse ist
für jedermann sichtbar) und internal. Eine Ausnahme
stellt hierbei die Verschachtelung von Klassen in anderen Klassen dar.
Dieses Thema ist etwas komplexer und wird in Kapitel 8, Mehr zu
Klassen, behandelt.
Anhand von internal kann einem umfangreicheren
Satz Klassen Zugriff gewährt werden, ohne dass jeder Benutzer Zugriff
auf die Klasse erhält. Dieses Schlüsselwort wird häufig
beim Schreiben von Helferklassen eingesetzt, die vor dem Benutzer der Klasse verborgen
werden sollen. In der .NET-Laufzeitumgebung wird mit internal
Zugriff auf alle Klassen gewährt, die sich in der gleichen Assemblierung
wie diese Klasse befinden.
Im Allgemeinen sollten Klassen als internal
deklariert werden, es sei denn, der Benutzer soll Zugriff auf die Klasse
erhalten.
8.2 Verwenden von internal für Klassenmitglieder
 
Der Modifikator internal kann auch
für ein Klassenmitglied verwendet werden. Hierbei kann von Klassen
derselben Assemblierung aus auf das Mitglied zugegriffen werden, nicht
jedoch von Klassen außerhalb der Assemblierung aus.
Dies ist besonders nützlich, wenn verschiedene
öffentliche Klassen zusammenarbeiten müssen, einige der gemeinsam
verwendeten Mitglieder jedoch nicht für die Allgemeinheit offen
gelegt werden sollen. Sehen Sie sich folgendes Beispiel an:
public class DrawingObjectGroup
{
public DrawingObjectGroup()
{
objects = new DrawingObject[10];
objectCount = 0;
}
public void AddObject(DrawingObject obj)
{
if (objectCount < 10)
{
objects[objectCount] = obj;
objectCount++;
}
}
public void Render()
{
for (int i = 0; i < objectCount; i++)
{
objects[i].Render();
}
}
DrawingObject[] objects;
int objectCount;
}
public class DrawingObject
{
internal void Render() {}
}
class Test
{
public static void Main()
{
DrawingObjectGroup group = new DrawingObjectGroup();
group.AddObject(new DrawingObject());
}
}
Hier enthält das Objekt DrawingObjectGroup
bis zu 10 Zeichenobjekte. Der Benutzer soll einen Verweis auf ein
DrawingObject verwenden dürfen, es ist jedoch nicht
zulässig, für dieses Objekt Render() aufzurufen.
Aus diesem Grund wird die Funktion Render() als intern
gekennzeichnet.
8.3 internal protected
 
Eine erhöhte Flexibilität bei der Klassendefinition
wird durch den Modifikator internal protected erreicht.
Durch internal protected wird gekennzeichnet, dass
ein Mitglied von einer Klasse aus zugänglich ist, die entweder
über internal oder anhand von protected
Zugriff erhalten könnte. Mit anderen Worten, internal protected
bietet Zugriff über internal oder protected.
8.4 Die Beziehung zwischen Klassen- und Mitgliedszugriff
 
Zugriffsmodifikatoren müssen für Klassen
und Mitglieder gleichermaßen vorhanden sein, damit auf ein Mitglied
zugegriffen werden kann. Der Zugriff auf Mitglieder wird durch die Klasse
beschränkt, damit der Zugriffsumfang für die Klasse nicht
überschritten wird.
Sehen Sie sich folgendes Beispiel an:
internal class MyHelperClass
{
public void PublicFunction() {}
internal void InternalFunction() {}
protected void ProtectedFunction() {}
}
Wenn diese Klasse als public deklariert
würde, entsprächen die Zugriffsmöglichkeiten für
Mitglieder denen des festgelegten Zugriffs, d. h. PublicFunction()
wäre öffentlich, InternalFunction() wäre
intern, ProtectedFunction() wäre geschützt.
Da die Klasse jedoch als intern deklariert ist,
wird der Zugriff public für die Funktion PublicFunction()
auf internal beschränkt.
|