Объектно-ориентированное программирование.
Наследование и полиморфизм
Наследование
Следующее важное свойство
объектовых типов позволяет при построении нового объектового типа
использовать некоторый ранее определённый объектовый тип. Пусть, например,
необходимо построить объектовый тип, управляющий простой геометрической
фигурой - кругом - на экране дисплея. Ясно, что структура информация для
определения круга очень похожа на описанную в предыдущем разделе структуру
для точки: здесь также необходимы поля X и Y для фиксации центра круга в
текущий момент. Нужно ещё добавить поле для хранения величины радиуса круга.
Традиционный стиль программирования допускает два решения. Во-первых, можно
ввести для круга совершенно новую структуру, повторив в ней (может быть, под
другими именами) те же поля X, Y и Visible и добавив новое поле Radius.
Во-вторых, можно сконструировать структуру для круга, использовав в ней поле
с типом, ранее определённым для точки (сделать "структуру в структуре"). Оба
подхода вполне приемлемы, однако объектно-ориентированное программирование
предполагает иной подход, который по ряду причин является гораздо более
предпочтительным. Объектно-ориентированный стиль позволяет определить новый
объект как потомок другого ранее определённого типа. Это означает, что новый
тип автоматически получает все поля и методы ранее введённого типа, который
в этом случае называется предком или родительским типом. В этом случае в
определении типа-потомка должно быть указано (в круглых скобках после
служебного слова object) имя родительского типа:
Circle = object (Point)
Radius: integer;
end;
Задание родительского типа
означает, что в объектовом типе Circle неявно присутствуют все поля из типа
Point; аналогично, для переменной нового типа доступны все методы из Point:
var
OneCircle: Circle;
begin
OneCircle.Init(100,200);
OneCircle.Radius := 30;
. . .
Описанное свойство
наследования характеристик одного объекта другим называется наследованием
является одним из основных свойств ООП и широко используется в
объектно-ориентированном программировании. Один тип может являться предком
для произвольного числа типов-потомков, в то время как любой объектовый тип
может наследовать поля и методы только одного типа-родителя, который
указывается в круглых скобках. Тип потомок может, в свою очередь, выступать
как предок по отношению к другому объектовому типу (типам). Так, можно
определить фигуру "кольцо", состоящую из двух концентрических кругов:
type
Ring = object (Circle)
Radius2: integer;
end;
Полиморфизм
Тип Ring наследует поле
Radius из своего непосредственного родителя Circle, а также поля и методы из
типа Point, который также считается (косвенным) предком для Ring. Длина
такой цепочки наследования в языке никак не ограничивается. По правилу
наследования тип Circle имеет в своём составе методы объекта-предка Point.
Однако, легко видеть, что методы SwithOn, SwithOff не подходят для рисования
круга. Поэтому, полное описание типа Circle должно содержать также
собственные методы для рисования и удаления круга и его передвижения по
экрану. Самым простым решением было бы ввести в новый тип такие методы, дав
им некоторые новые имена. Но объектно-ориентированный подход позволяет
определить новые методы СО СТАРЫМИ именами, ПЕРЕОПРЕДЕЛИВ тем самым методы
типа-родителя. Сразу отметим, что переопределять можно только методы; поля,
указанные в родительском типе, безусловно наследуются типом-потомком и не
могут быть в нём переопределены (то есть имена полей потомка не должны
совпадать с именами полей типа-предка). Кроме того, новый метод в типе
потомке может иметь совершенно другие параметры. нежели одноимённый метод из
типа-предка. Возможность иметь в одной программе несколько
подпрограмм-методов для разных объектов называется в ООП полиморфизмом, и
является одним из основных свойств ООП. Компилятор, не обнаружив вызываемого
метода, просматривает определение родительского типа; если данный метод и
здесь не определён, то аналогично просматривается родитель родителя и т.д.
Если очередной объектовый тип не имеет предка, а метод не обнаружен, то
компилятор фиксирует ошибку. Механизм наследования, являясь достаточно
простым для понимания и использования, предоставляет широкие возможности при
разработке программ. Имея несколько "базовых" объектовых типов (например, в
интерфейсном разделе модуля), можно на их основе конструировать новые
объекты, добавляя в них новые поля и расширяя и/или переопределяя
соответствующие методы. Правило совместимости типов по присваиванию,
действующее для случая объектовых типов, формулируется достаточно просто:
совместимыми по присваиванию являются, кроме эквивалентных типов (то есть
объявленных в виде T1=T2), объектовые типы, состоящие в отношении
наследования, причём присваивание может происходить в направлении ОТ
типа-потомка К родительскому типу, НО НЕ НАОБОРОТ. В подобных случаях
копируются (присваиваются) только те поля, которые являются общими для обоих
типов. Такое же правило действует и для указателей на объектовые типы.
Контрольные вопросы.
- Какое свойство ООП называют наследованием?
- Какое свойство ООП называют полиморфизмом?
- Объясните понятия объект-предок и
объект-потомок.
- Можно ли переопределять поля объекта-предка?
Задания для
самостоятельного выполнения.
- Напишите программу с объектом "линия" -
потомком объекта "точка".
- Напишите программу с объектом "прямоугольный
треугольник" - потом ком объекта точка.
- Напишите программу с объектом "прямоугольник" -
потомком объекта "точка"
- Напишите программу с объектом "пульсирующая
окружность" - потомком объекта "точка".
НАЗАД
ДАЛЕЕ
|