Главная/Раздел  5

 

 

Главная

 

 Раздел 1

 

Раздел 2

 

Раздел 3

 

Раздел 4

 

Раздел 5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Объектно-ориентированное программирование.
Наследование и полиморфизм

Наследование

Следующее важное свойство объектовых типов позволяет при построении нового объектового типа использовать некоторый ранее определённый объектовый тип. Пусть, например, необходимо построить объектовый тип, управляющий простой геометрической фигурой - кругом - на экране дисплея. Ясно, что структура информация для определения круга очень похожа на описанную в предыдущем разделе структуру для точки: здесь также необходимы поля 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), объектовые типы, состоящие в отношении наследования, причём присваивание может происходить в направлении ОТ типа-потомка К родительскому типу, НО НЕ НАОБОРОТ. В подобных случаях копируются (присваиваются) только те поля, которые являются общими для обоих типов. Такое же правило действует и для указателей на объектовые типы.

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

  1. Какое свойство ООП называют наследованием?
  2. Какое свойство ООП называют полиморфизмом?
  3. Объясните понятия объект-предок и объект-потомок.
  4. Можно ли переопределять поля объекта-предка?

Задания для самостоятельного выполнения.

  1. Напишите программу с объектом "линия" - потомком объекта "точка".
  2. Напишите программу с объектом "прямоугольный треугольник" - потом ком объекта точка.
  3. Напишите программу с объектом "прямоугольник" - потомком объекта "точка"
  4. Напишите программу с объектом "пульсирующая окружность" - потомком объекта "точка".

НАЗАД                    ДАЛЕЕ        

 

 

 

 

 

 

 

 

 

 :::

 

 :::

 

 

 

 

 

 

 

Сайт создан в системе uCoz