Введение в С# для программистов (A programmer's Introduction to C#)

Автор - Eric Gunnerson
перевод - Трубецкой А.


На главную
Содержание
Глава 6
Глава 8

Глава 7: Доступ к членам класса

На этапе проектирования важно решить, какой доступ необходимо обеспечить к членам создаваемого класса. В C# доступ к членам класса контролируется несколькими способами.

Доступ к классу
Наиболее простым способом контролировать доступ является использование модификатора доступа по отношению ко всему классу. В большинстве случаев подходящими для класса модификаторами являются только public, который означает, что класс может быть виден из любой части кода, и internal. Исключением из этого правила могут быть вложенные классы, которые вообще являются более сложными и описываются в главе 8.

Модификатор internal позволяет предоставить доступ к данному классу большому количеству классов, не гарантируя при этом доступ абсолютно всем классам. Класс, помеченный как internal, становится доступным всем классам, входящим в данную сборку (assembly). Таким образом такой класс становится доступным всей программе, но нигде больше.
Модификатор internal часто используется при написании вспомогательных классов (helper classes), которые должны быть скрыты от конечного пользователя.

Примечание: в С++ похожие права доступа обычно обеспечиваются ключевым словом friend, которое предоставляет доступ к определенному классу. Дружественные отношения между классами обеспечивают большую степень детализации в определении того, какой класс будет иметь доступ к полям данного класса. Однако на практике уровень доступа, обеспечиваемый ключевым словом internal, оказывается достаточным.

В принципе все классы должны быть internal, если нет необходимости предоставлять пользователю доступ к этим классам.


Использование модификатора internal для членов класса
Модификатор internal можно также применять к членам класса. В этом случае модификатор internal открывает доступ к члену класса для всех классов, находящихся в той же сборке. Только классы из других сборок не имеют доступа к указанному члену класса.

Такое применение модификатора internal особенно полезно, если необходимо организовать взаимодействие между несколькими открытыми (public) классами, но некоторые члены этих классов не должны быть доступны любому коду.
Рассмотрим пример:
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());
}
}
Здесь объект DrawingObjectGroup содержит 10 рисованных объектов. Пользователь может иметь ссылку на DrawingObject, но не имеет права вызывать метод Render() для объекта DrawingObject, поскольку метод Render() имеет модификатор internal.
Примечание: такой код не имеет смысла использовать в реальной программе. В .NET Common Language Runtime есть множество классов-коллекций, которые делают вещи подобного рода гораздо проще и надежнее.


internal protected
Для обеспечения дополнительной гибкости в определении класса можно использовать сочетание модификаторов internal и protected, чтобы показать, что к члену класса могут иметь доступ либо классы из той же сборки, либо подклассы данного класса.


Взаимодействие доступа к классу и доступа к члену класса
Член класса является доступным, если доступ разрешен и его собственными модификаторами, и модификаторами класса, в котором он объявлен. Модификаторы члена класса не могут предоставлять больший доступ, чем модификаторы самого класса.

Рассмотрим следующую ситуацию:
internal class MyHelperClass {
public void PublicFunction() {}
internal void InternalFunction() {}
protected void ProtectedFunction() {}
}
Если бы этот класс был объявлен как public, доступ к его членам соответствовал бы их модификаторам, т.е. метод PublicFunction() был бы public, метод InternalFunction() был бы internal, а метод ProtectedFunction() был бы protected. Однако класс имеет модификатор internal, поэтому доступ к методу PublicFunction() ограничивается до internal.

На главную
Глава 6
Глава 8


Автотехника Сантехника Флора Косметика Одежда Часы