Полиморфизм
Тип Ring наследует поле Radius из своего непосредственного родителя Circle, а также поля и методы из типа Point, который также считается (косвенным) предком для Ring. Длина такой цепочки наследования в языке никак не ограничивается.
По правилу наследования тип Circle имеет в своём составе методы объекта-предка Point. Однако, легко видеть, что методы SwithOn, SwithOff не подходят для рисования круга. Поэтому, полное описание типа Circle должно содержать также собственные методы для рисования и удаления круга и его передвижения по экрану. Самым простым решением было бы ввести в новый тип такие методы, дав им некоторые новые имена. Но объектно-ориентированный подход позволяет определить новые методы СО СТАРЫМИ именами, ПЕРЕОПРЕДЕЛИВ тем самым методы типа-родителя.
Сразу отметим, что переопределять можно только методы; поля, указанные в родительском типе, безусловно наследуются типом-потомком и не могут быть в нём переопределены (то есть имена полей потомка не должны совпадать с именами полей типа-предка). Кроме того, новый метод в типе потомке может иметь совершенно другие параметры. нежели одноимённый метод из типа-предка.
Возможность иметь в одной программе несколько подпрограмм-методов для разных объектов называется в ООП полиморфизмом, и является одним из основных свойств ООП.
Компилятор, не обнаружив вызываемого метода, просматривает определение родительского типа; если данный метод и здесь не определён, то аналогично просматривается родитель родителя и т.д. Если очередной объектовый тип не имеет предка, а метод не обнаружен, то компилятор фиксирует ошибку.
Механизм наследования, являясь достаточно простым для понимания и использования, предоставляет широкие возможности при разработке прог рамм. Имея несколько "базовых" объектовых типов (например, в интерфейсном разделе модуля), можно на их основе конструировать новые объекты, добавляя в них новые поля и расширяя и/или переопределяя соответствующие методы.
Правило совместимости типов по присваиванию, действующее для случая объектовых типов, формулируется достаточно просто: совместимыми по присваиванию являются, кроме эквивалентных типов (то есть объявленных в виде T1=T2), объектовые типы, состоящие в отношении наследования, причём присваивание может происходить в направлении ОТ типа-потомка К родительскому типу, НО НЕ НАОБОРОТ.
В подобных случаях копируются (присваиваются) только те поля, которые являются общими для обоих типов. Такое же правило действует и для указателей на объектовые типы.
Контрольные вопросы.
1. Какое свойство ООП называют наследованием?
2. Какое свойство ООП называют полиморфизмом?
3. Объясните понятия объект-предок и объект-потомок.
4. Можно ли переопределять поля объекта-предка?