Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л3 Объектно-ориентированное программирование.doc
Скачиваний:
2
Добавлен:
10.11.2019
Размер:
62.46 Кб
Скачать

Полиморфизм

Тип Ring наследует поле Radius из своего непосредственного родителя Circle, а также поля и методы из типа Point, который также считается (косвенным) предком для Ring. Длина такой цепочки наследования в языке никак не ограничивается.

По правилу наследования тип Circle имеет в своём составе методы объекта-предка Point. Однако, легко видеть, что методы SwithOn, SwithOff не подходят для рисования круга. Поэтому, полное описание типа Circle должно содержать также собственные методы для рисования и удаления круга и его передвижения по экрану. Самым простым решением было бы ввести в новый тип такие методы, дав им некоторые новые имена. Но объектно-ориентированный подход позволяет определить новые методы СО СТАРЫМИ именами, ПЕРЕОПРЕДЕЛИВ тем самым методы типа-родителя.

Сразу отметим, что переопределять можно только методы; поля, указанные в родительском типе, безусловно наследуются типом-потомком и не могут быть в нём переопределены (то есть имена полей потомка не должны совпадать с именами полей типа-предка). Кроме того, новый метод в типе потомке может иметь совершенно другие параметры. нежели одноимённый метод из типа-предка.

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

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

Механизм наследования, являясь достаточно простым для понимания и использования, предоставляет широкие возможности при разработке прог рамм. Имея несколько "базовых" объектовых типов (например, в интерфейсном разделе модуля), можно на их основе конструировать новые объекты, добавляя в них новые поля и расширяя и/или переопределяя соответствующие методы.

Правило совместимости типов по присваиванию, действующее для случая объектовых типов, формулируется достаточно просто: совместимыми по присваиванию являются, кроме эквивалентных типов (то есть объявленных в виде T1=T2), объектовые типы, состоящие в отношении наследования, причём присваивание может происходить в направлении ОТ типа-потомка К родительскому типу, НО НЕ НАОБОРОТ.

В подобных случаях копируются (присваиваются) только те поля, которые являются общими для обоих типов. Такое же правило действует и для указателей на объектовые типы.

Контрольные вопросы.

1. Какое свойство ООП называют наследованием?

2. Какое свойство ООП называют полиморфизмом?

3. Объясните понятия объект-предок и объект-потомок.

4. Можно ли переопределять поля объекта-предка?