Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

3.5.3Защищенный доступ для членов экземпляров.

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

Пусть B будет классом, в котором объявлен защищенный член экземпляра M, и пусть D будет производным классом B. В рамках тела_класса D доступ к M может принять одну из следующих форм.

  • Имя_типа или первичное_выражение без уточнения формы M.

  • Первичное_выражение формы E.M с условием, что тип E является T или производным от T классом, где T является типом класса D или типом класса, сконструированным из D.

  • Первичное_выражение формы base.M.

Дополнительно к данным формам доступа производный класс может осуществлять доступ к конструктору защищенных экземпляров базового класса в инициализаторе_конструктора (§10.11.1).

In the example

public class A { protected int x;

static void F(A a, B b) { a.x = 1; // Ok b.x = 1; // Ok } }

public class B: A { static void F(A a, B b) { a.x = 1; // Error, must access through instance of B b.x = 1; // Ok } }

в рамках A можно осуществить доступ к x через экземпляры A и B, так как в любом случае доступ осуществляется через экземпляр A или производный от A класс. Однако в рамках B невозможно осуществить доступ к x через экземпляр A, так как A не произведен из B.

В примере:

class C<T> { protected T x; }

class D<T>: C<T> { static void F() { D<T> dt = new D<T>(); D<int> di = new D<int>(); D<string> ds = new D<string>(); dt.x = default(T); di.x = 123; ds.x = "test"; } }

три присваивания x разрешены, так как они все осуществляются через экземпляры типов класса, сконструированные из универсального типа.

3.5.4Ограничения доступности

Некоторым конструкциям языка C# требуется, чтобы тип был хотя бы доступен как член или другой тип. Считается, что доступность типа T не меньше доступности члена или типа M, если домен доступности T является множеством домена доступности M. Другими словами, доступность T не меньше доступности M, если T доступен во всех контекстах, в которых доступен M.

Существуют следующие ограничения доступности.

  • Прямой базовый класс типа класса должен быть не менее доступен, чем сам тип класса.

  • Явный базовый интерфейс типа интерфейса должен быть не менее доступен, чем сам тип интерфейса.

  • Тип возвращаемого значения и типы параметров типа делегата должны быть не менее доступны, чем сам тип делегата.

  • Тип константы должен быть не менее доступен, чем сама константа.

  • Тип поля должен быть не менее доступен, чем само поле.

  • Тип возвращаемого значения и типы параметров метода должны быть не менее доступны, чем сам метод.

  • Тип свойства должен быть не менее доступен, чем само свойство.

  • Тип события должен быть не менее доступен, чем само событие.

  • Тип и типы параметра индексатора должны быть не менее доступны, чем сам индексатор.

  • Тип возвращаемого значения и типы параметра оператора должны быть не менее доступны, чем сам оператор.

  • Типы параметра конструктора экземпляров должны быть не менее доступны, чем сам конструктор экземпляров.

Пример:

class A {...}

public class B: A {...}

класс B приводит к ошибке времени компиляции, так как A менее доступен, чем B.

Аналогично, в примере

class A {...}

public class B { A F() {...}

internal A G() {...}

public A H() {...} }

метод H в B приводит к ошибке времени компиляции, так как тип возвращаемого значения A менее доступен, чем метод.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]