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

10.6.5Запечатанные методы

Если объявление метода экземпляра содержит модификатор sealed, метод является запечатанным методом. Если объявление метода экземпляра включает модификатор sealed, оно должно также включать модификатор override. Использование модификатора sealed предотвращает последующее переопределение метода в производном классе.

Пример:

using System;

class A { public virtual void F() { Console.WriteLine("A.F"); }

public virtual void G() { Console.WriteLine("A.G"); } }

class B: A { sealed override public void F() { Console.WriteLine("B.F"); }

override public void G() { Console.WriteLine("B.G"); } }

class C: B { override public void G() { Console.WriteLine("C.G"); } }

класс B предоставляет два переопределяющих метода: метод F с модификатором sealed и метод G без него. Использование классом B модификатора sealed предотвращает последующее переопределение метода F в классе C.

10.6.6Абстрактные методы

Если объявление метода экземпляра содержит модификатор abstract, метод является абстрактным методом. Хотя абстрактный метод неявно является также виртуальным методом, он не может иметь модификатора virtual.

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

Объявления абстрактных методов допускаются только в абстрактных классах (§10.1.1.1).

В примере

public abstract class Shape { public abstract void Paint(Graphics g, Rectangle r); }

public class Ellipse: Shape { public override void Paint(Graphics g, Rectangle r) { g.DrawEllipse(r); } }

public class Box: Shape { public override void Paint(Graphics g, Rectangle r) { g.DrawRect(r); } }

класс Shape определяет абстрактное представление геометрической фигуры самоокрашивающегося объекта. Метод Paint является абстрактным, поскольку отсутствует значащая реализация по умолчанию. Классы Ellipse и Box представляют собой конкретные реализации метода Shape. Поскольку эти классы являются неабстрактными, требуется, чтобы они переопределяли метод Paint и предоставляли фактическую реализацию.

Если базовый_доступ (§7.6.8) ссылается на абстрактный метод, возникает ошибка времени компиляции. В примере

abstract class A { public abstract void F(); }

class B: A { public override void F() { base.F(); // Error, base.F is abstract } }

при вызове метода base.F() выполняется ссылка на абстрактный метод, что порождает ошибку времени компиляции.

В объявлении абстрактного метода допускается переопределение виртуального метода. Это позволяет абстрактному классу принудительно выполнить повторную реализацию метода в производных классах. При этом исходная реализация метода становится недоступна. В примере

using System;

class A { public virtual void F() { Console.WriteLine("A.F"); } }

abstract class B: A { public abstract override void F(); }

class C: B { public override void F() { Console.WriteLine("C.F"); } }

в классе A объявляется виртуальный метод, который переопределяется в классе B абстрактным методом. Последний переопределяется в классе C с использованием собственной реализации.

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