- •Предисловие
- •Введение в объектно-ориентированное программирование Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм Объект
- •Наследование и полиморфизм
- •Агрегация
- •Апология ооп
- •Демонстрация преимущества объектно-ориентированного программирования на примере системы вывода графических изображений
- •Реализация с помощью структурных технологий
- •Реализация с помощью объектно-ориентированных технологий
- •Создание классов и объектов в actionscript 2.0
- •Основы создания классов и объектов
- •Объектно-ориентированные, объектные и объектно-базированные языки программирования
- •Квалификаторы доступа и методы доступа Get/Set Первая версия класса библиографических карточек
- •Вторая версия класса библиографических карточек
- •Задание 1
- •Наследование и полиморфизм в actionscript 2.0 Наследование
- •Полиморфизм
- •Задание 2
- •Литература
Наследование и полиморфизм
Классы могут быть связаны друг с другом различными отношениями. Одним из основных таких отношений является отношение класс-подкласс, известный в объектно-ориентированном программировании как наследование. Например, класс автомобилей Audi 6 является подклассом легковых автомобилей, который в свою очередь входит в более крупный класс автомобилей, а последний является подклассом класса транспортных средств, который помимо автомобилей включает в себя самолеты, корабли поезда и т. д. Примером подобных отношений являются системы классификации в ботанике и зоологии.
Отношением, обратным наследованию, является обобщение или генерализация. Она указывает, что некий класс является более общим (обобщенным) классом другого класса. Класс транспортных средств, к примеру, является генерализацией классов автомобилей, самолетов и кораблей. В UML принято пользоваться именно понятием «генерализация», что отразилось и в символе, представляющем это отношение: большая не закрашенная стрелка, направленная на класс, являющимся обобщением некоторых классов (рис. 1, б).
При наследовании все атрибуты и методы родительского класса наследуются классом-потомком. Наследование может быть многоуровневым, и тогда классы, находящиеся на нижних уровнях иерархии, унаследуют все свойства (атрибуты и методы) всех классов, прямыми или косвенными потомками которых они являются. Класс В унаследует атрибуты и методы класса А и, следовательно, будет обладать атрибутами А, В, С и D и методами А, В, С и D, а класс С - атрибутами А, В, С, Е, F и методами А, В и Е.
Помимо единичного существует и множественное наследование, когда класс наследует сразу нескольким классам (рис. 1, в). При этом он унаследует свойства всех классов, потомком которых он является. При использовании множественного наследования необходимо быть особенно внимательным, так как возможны коллизии, когда класс-потомок может унаследовать одноименные свойства с различным содержанием.
Такая проблема известна как «Алмаз Никсона». Ее суть состоит в том, как должен повести себя Никсон, который является квакером и в то же время принадлежит к республиканской партии. А известно, что квакеры - пацифисты, в то время как республиканцы - сторонники военного решения проблем. На лицо явная коллизия. В разных языках, поддерживающих парадигму ООП и допускающих множественное наследование (а оно допустимо не во всех языках и, например, язык Java, широко распространенный в сфере интернет-приложений, не поддерживает множественного наследования), она преодолевается по-разному, но в любом случае необходимо быть предельно осторожным при возникновении таких ситуаций.
При наследовании одни методы класса могут замещаться другими. Так, класс транспортных средств будет обладать обобщенным методом движения. В классах-потомках этот метод будет конкретизирован: автомобиль будет ездить, самолет - летать, корабль - плавать. Такое изменение семантики метода называется полиморфизмом. Полиморфизм - это выполнение методом с одним и тем же именем различных действий в зависимости от контекста, в частности, от принадлежности тому или другому классу. В разных языках программирования полиморфизм реализуется различными способами. Например, в С++ он реализован с помощью механизма виртуальных функций.
