Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_OOP.docx
Скачиваний:
5
Добавлен:
21.09.2019
Размер:
59.42 Кб
Скачать
  1. Виртуальные функции.

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

v i r t u a l в базовом классе и переопределяемый в одном или нескольких производных

классах. Таким образом, каждый производный класс может иметь собственную вер-

сию виртуального метода. именно тип объекта, на который указывает ссылка (а не тип ссылки) определя-

ет, какая версия виртуального метода будет выполнена. Таким образом, если базовый

класс содержит виртуальный метод и из этого класса выведены производные классы,

то при наличии ссылки на различные типы объектов (посредством ссылки на базовый

класс) будут выполняться различные версии этого виртуального метода.

Чтобы объявить метод в базовом классе виртуальным, его объявление необходимо

предварить ключевым словом v i r t u a l . При переопределении виртуального метода в

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

  1. Абстрактные классы.

Часто разработчику бывает необходимым придать группе классов одинаковые свойства. Для решения этой задачи применяют абстрактные классы. Абстрактный класс – это класс, обладающий хотя бы одной чисто виртуальной функцией.

Необходимо иметь средство, благодаря которому произ-

водный класс обязательно переопределит все необходимые методы. Этим средством в

С# является абстрактный метод. Абстрактный класс можно использовать только как определение интерфейса и в качестве базы для других классов. Дело в том, что если абстрактный класс указан в качестве базового для какого-нибудь класса, то компилятор «заставит» программиста создать для производного класса функции-члены в точности соответствующие сигнатуре чисто виртуальных функций. Все классы, которые наследуют абстрактный класс, обладают общим набором функций-членов, т. е. они имеют одинаковый интерфейс, спецификацией которого является абстрактный класс.

Абстрактный метод создается с помощью модификатора типа a b s t r a c t . Абстракт-

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

этому производный класс должен его переопределить, поскольку он не может исполь-

зовать версию, предложенную в базовом классе. Нетрудно догадаться, что абстракт-

ный метод автоматически является виртуальным, поэтому и нет необходимости в

использовании модификатора v i r t u a l . Более того, совместное использование моди-

фикаторов v i r t u a l и abstract считается ошибкой.

Для объявления абстрактного метода используйте следующий формат записи.

abstract ТИП ИМЯ(список_параметров) ; Класс, содержащий один или несколько абстрактных методов, также должен быть объявлен как абстрактный с помощью спецификатора abstract, который ставится перед объявлением class. Поскольку абстрактный класс нереализуем в полном объеме, невозможно создать его экземпляры, или объекты. Таким образом, попытка соз-

дать объект абстрактного класса с помощью оператора new приведет к возникновению

ошибки времени компиляции. Если производный класс выводится из абстрактного, он может реализовать все абстрактные методы базового класса. В противном случае такой производный класс также должен быть определен как абстрактный.

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