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

10.1.1.1Абстрактные классы

Модификатор abstract используется для указания незавершенности класса и необходимости его использования только в качестве базового класса. Ниже представлены отличия абстрактного класса от неабстрактного.

  • Абстрактный класс не может быть создан непосредственно, использование оператора new в абстрактном классе является ошибкой времени компилирования. Хотя есть возможность иметь переменные и значения, имеющие типы времени компиляции, являющиеся абстрактными типами, такие переменные и значения будут обязательно иметь значение null или будут содержать ссылки на экземпляры неабстрактных классов, производных от абстрактных типов.

  • Абстрактный класс может (но не должен) содержать абстрактные члены.

  • Абстрактный класс не может быть запечатанным.

Если неабстрактный класс является произведным от абстрактного класса, неабстрактный класс должен включать фактические реализации всех унаследованных абстрактных членов, таким образом переопределяя данные абстрактные члены. Рассмотрим следующий пример:

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

abstract class B: A { public void G() {} }

class C: B { public override void F() { // actual implementation of F } }

В этом примере абстрактный класс A представляет абстрактный метод F. Класс B представляет дополнительный метод G, но так как он не предоставляет реализацию F, класс B должен быть также объявлен абстрактным. Класс C переопределяет F и обеспечивает фактическую реализацию. Так как в классе C нет абстрактных членов, класс C может быть (но не должен) быть абстрактным.

10.1.1.2Запечатанные классы

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

Запечатанный класс не может быть также абстрактным классом.

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

10.1.1.3Статические классы

Модификатор static используется для пометки класса, объявленного в качестве статического класса. Для статического класса не может быть создан экземпляр, он не может быть использован в качестве типа и может содержать только статические члены. Только статический класс может содержать объявления методов расширения (§10.6.9).

На объявление статического класса накладываются следующие ограничения.

  • Статический класс не может содержать модификатор sealed или abstract. Однако следует обратить внимание, что, поскольку для статического класса не может быть создан экземпляр или производный класс, его поведение соответствует поведению запечатанного и абстрактного класса одновременно.

  • Статический класс не может содержать спецификацию базы_класса (§10.1.4) и не может явно указывать базовый класс или список реализованных интерфейсов. Статический класс неявно наследуется из типа object.

  • Статический класс может содержать только статические члены (§10.3.7). Обратите внимание, что константны и вложенные типы классифицируются как статические члены.

  • Статический класс не может содержать члены с объявленной доступностью protected или protected internal.

Нарушение данных ограничений приводит к ошибке времени компилирования.

Статический класс не имеет конструкторов экземпляров. Невозможно объявить конструктор экземпляров в статическом классе; конструктор экземпляров по умолчанию (§10.11.4) не предоставляется для статического класса.

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

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