Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие по Базам данных.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.3 Mб
Скачать

1.4.4.6. Единичное наследование. Множественное наследование.

Единичное наследование имеет место, когда над классом есть только один суперкласс (родительский). Такое положение иллюстрируется примером с музыкальными инструментами (классы ‘струнные инструменты’, ‘духовые инструменты’). Большинство современных ОО-систем поддерживает единичное наследование. Когда система посылает сообщение экземпляру объекта, поиск соответствующего метода производится по всей иерархии по алгоритму:

  1. Скопируется класс, которому принадлежит объект.

  2. Если метод не найден, скопируется суперкласс.

Процесс копирования повторяется до тех пор, пока не произойдет следующее:

  1. Метод найден.

  2. Достигнут верх иерархии классов, но метод не обнаружен. При этом система генерирует сообщение о том, что метод не найден.

На рис.20 представлено единичное наследование.

Рис20. Единичное наследование

Если мы посылаем сообщение MonthPay (ежемесячные выплаты) экземпляру объекта Pilot, будет выполняться метод MonthPay объекта, определенный в его суперклассе Employee (сотрудник). ОО-системы обеспечивают многократное использование кода: код метода MonthPay доступен и для подкласса Pilot и Mechanic.

Множественное наследование имеет место, когда над классом имеется более одного родителя (суперкласс). Рассмотрим пример с множественным наследованием.

Подкласс ‘Мотоциклы’ наследует свойства как от суперкласса ‘Транспортное средство’, так и от суперкласса ‘Велосипед’. От суперкласса ‘Транспортное средство’ класс ‘Мотоциклы’ наследует:

свойства (топливо, поршневая группа, мощность);

поведение (запустить двигатель, нажать педаль газа и т.д.).

От суперкласса ‘Велосипед’ класс ‘Мотоциклы’ наследует:

свойства (два колеса, рулевая колонна);

поведение (сесть верхом, повернуть рулевую колонну).

Назначать имя переменной или методу экземпляра при множественном наследовании иерархии класса нужно с осторожностью. Например, если используются одинаковые имена для переменной или метода экземпляра в каждом из суперклассов, то ОО-система должна определить путь, для того чтобы решить, какой метод или атрибут необходимо наследовать. Если оба класса ‘Транспортное средство’ и ‘Велосипед’ используют переменную экземпляра MAXSPEED, возникает вопрос: ‘Какую версию переменной экземпляра MAXSPEED будет наследовать метод ‘Мотоцикл’ в этом случае?’ ОО-система в случае невозможности выбора выведет сообщение с разъяснением возникшей проблемы; попросит пользователя ввести корректное значение или выполнить нужные действия; будет использовать правила наследования, определенные пользователем для подкласса в сети классов. Такие правила наследования управляют наследованием методов и переменных экземпляра.

1.4.4.7. Переопределение методов и полиморфизм

Можно переопределить (override) метод суперкласса на уровне подкласса.

Рис.21. Переопределение метода иерархии класса Employee

Для расчета премии для всех сотрудников определен метод Bonus (премия). Расчет премии зависит от специализации сотрудника. Каждый сотрудник, за исключением пилотов, получает премию 5% от годовой зарплаты. Пилоты получают премию на основе налетанных часов (ACCUM), а не на основе годовой зарплаты. Определяя метод Bonus в подклассе Pilot, мы определяем метод Bonus класса Employee для всех объектов подкласса Pilot. При этом переопределение метода Bonus в подклассе Pilot не повлияет на расчет премии в подклассе Mechanic.

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

В терминах ОО полиморфизм означает:

возможность использования одинаковых имен для методов, определенных в различных классах иерархий;

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

Рис.22. Полиморфизм в иерархии класса Employee

На базе иерархии класса Employee система рассчитывает ежемесячные выплаты пилотам и механикам, посылая одно и то же сообщение MonthPay объекту Pilot или Механик. Объект возвращает корректное значение выплаты, даже если в MonthPay включается оплата полета flypay, принадлежащая объекту Пилот, и overtimepay (оплата сверхурочных), свойственная объекту Механик. Порядок расчета ежемесячной зарплаты для обоих подклассов один и тот же: годовой оклад делится на 12 месяцев.

Выражение SuperMonthPay в методе MonthPay класса Pilot указывая, что объект наследует метод MonthPay суперкласса. Другие объектно-ориентированные языки программирования, например, С++, используют запись с точкой: Employee. MonthPay.

Особенности полиморфизма:

определение метода MonthPay класса Pilot переопределяет и расширяет метод MonthPay суперкласса Employee;

метод MonthPay, определенный в суперкласс Employee, повторно используется подклассами Pilot и Mechanic.

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