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

10.7.5Виртуальные, запечатанные, переопределяющие и абстрактные методы доступа

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

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

Объявление свойства, содержащее одновременно модификаторы abstract и override, указывает, что свойство является абстрактным и переопределяет базовое свойство. Методы доступа такого свойства также являются абстрактными.

Объявления абстрактных свойств допускаются только в абстрактных классах (§10.1.1.1). Методы доступа унаследованного виртуального свойства можно переопределить в производном классе, включив объявление свойства, задающее директиву override. Этот способ называется переопределяющим объявлением свойства. Переопределяющее объявление свойства не объявляет новое свойство. Вместо этого оно уточняет реализацию методов доступа существующего виртуального свойства.

Переопределяющее объявление свойства должно задавать в точности такие же модификаторы доступа, тип и имя, что и у унаследованного свойства. Если унаследованное свойство содержит только один метод доступа (то есть является свойством, доступным только для чтения или только для записи), переопределяющее свойство должно включать только этот метод доступа. Если унаследованное свойство содержит оба метода доступа (является свойством, доступным на чтение и запись), переопределяющее свойство может включать один или оба метода доступа.

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

За исключением различий в синтаксисе объявления и вызова, поведение виртуальных, запечатанных, переопределяющих или абстрактных методов доступа в точности соответствует поведению виртуальных, запечатанных, переопределяющих или абстрактных методов. В частности, правила, описанные в разделах §10.6.3, §10.6.4, §10.6.5 и §10.6.6, применяются, как если бы методы доступа были методами соответствующего вида.

  • Метод доступа get соответствует не имеющему параметров методу, имеющему возвращаемое значение типа свойства и те же модификаторы, что и содержащее свойство.

  • Метод доступа set соответствует методу с типом возвращаемого значения void, одним параметром значения, имеющим тип свойства, и имеющему те же модификаторы, что и содержащее свойство.

В примере

abstract class A { int y;

public virtual int X { get { return 0; } }

public virtual int Y { get { return y; } set { y = value; } }

public abstract int Z { get; set; } }

X — это виртуально свойство только для чтения, Y — это виртуальное свойство только для записи, а Z — это абстрактное свойство для чтения и записи. Поскольку свойство Z является абстрактным, содержащий его класс A также должен быть объявлен как абстрактный.

В следующем примере показан класс, производный от класса A.

class B: A { int z;

public override int X { get { return base.X + 1; } }

public override int Y { set { base.Y = value < 0? 0: value; } }

public override int Z { get { return z; } set { z = value; } } }

В этом примере объявления свойств X, Y и Z представляют собой переопределяющие объявления свойств. Каждое объявление свойства точно соответствует модификаторам доступа, типу и имени соответствующего наследуемого свойства. В методе доступа get свойства X и методе доступа set свойства Y используется ключевое слово base для обращения к унаследованным методам доступа. Объявление свойства Z переопределяет оба абстрактных метода доступа. Таким образом, в классе B отсутствуют необработанные члены абстрактной функции, в связи с чем класс B может быть неабстрактным классом.

Если свойство объявлено с помощью модификатора override, все переопределенные методы доступа должны быть доступны переопределяющему коду. Кроме того, объявленные уровни доступа для самого свойства или индексатора и его методов доступа должны соответствовать уровням доступа переопределенного члена и его методов доступа. Пример.

public class B { public virtual int P { protected set {...} get {...} } }

public class D: B { public override int P { protected set {...} // Must specify protected here get {...} // Must not have a modifier here } }

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