Введение в программирование. Pascal и Delphi. Гурьянов Л.В - 109 стр.

UptoLike

108
{переместить центр окружности }
{ в координаты NewX, NewY }
end;
Метод "Показать" в классах "Окружность" и "Точка" называется
одинаково
Show, но реализуется в каждом классе по-своему. В
классе "Окружность" метод
Show рисует окружность, в классе "Точ-
ка" – точку (аналогично и для метода "Спрятать" –
Hide).
Код метода
MoveTo для класса "Окружность" (Circle.MoveTo):
Hide;
x := NewX;
y := NewY;
Show;
полностью совпадает с кодом метода MoveTo класса "Точка". Зачем
же писать одно и то же дважды?! Может быть, лучше в классе "Ок-
ружность" наследовать этот метод из класса "Точка"? Будет ли в
этом случае вызов объектом класса "Окружность" метода
MoveTo
(
наследуемого из класса "Точка") приводить к перемещению окруж-
ности, а не точки? Будет, если мы используем такое свойство объ-
ектно-ориентированной разработки, как
полиморфизм.
В языке Pascal полиморфизм
реализуется с помощью виртуаль-
ных методов
. Для использования полиморфизма необходимо выпол-
нить следующие действия:
для инициализации объекта класса использовать специальную
процедуру
Конструктор (constructor).
При вызове конструктора создается
Таблица виртуальных мето-
дов
(VMT), одна для конкретного класса. Эта таблица содержит ука-
затели на код реализации методов данного класса. Когда в программе
вызывается
виртуальный метод, то осуществляется обращение к
Таблице виртуальных методов того класса, объект которого в дан-
ный момент является активным. Затем по указателю таблицы нахо-
дится соответствующий код реализации вызванного метода и ему
передается управление;
одноименные в разных классах методы (в нашем случае это
Show и Hide) описать как виртуальные (virtual).
                             {переместить центр окружности      }
                             { в координаты NewX, NewY          }
  end;
   Метод "Показать" в классах "Окружность" и "Точка" называется
одинаково – Show, но реализуется в каждом классе по-своему. В
классе "Окружность" метод Show рисует окружность, в классе "Точ-
ка" – точку (аналогично и для метода "Спрятать" – Hide).
   Код метода MoveTo для класса "Окружность" (Circle.MoveTo):
    Hide;
    x := NewX;
    y := NewY;
    Show;
полностью совпадает с кодом метода MoveTo класса "Точка". Зачем
же писать одно и то же дважды?! Может быть, лучше в классе "Ок-
ружность" наследовать этот метод из класса "Точка"? Будет ли в
этом случае вызов объектом класса "Окружность" метода MoveTo
(наследуемого из класса "Точка") приводить к перемещению окруж-
ности, а не точки? Будет, если мы используем такое свойство объ-
ектно-ориентированной разработки, как полиморфизм.
   В языке Pascal полиморфизм реализуется с помощью виртуаль-
ных методов. Для использования полиморфизма необходимо выпол-
нить следующие действия:
   ƒ для инициализации объекта класса использовать специальную
процедуру Конструктор (constructor).
   При вызове конструктора создается Таблица виртуальных мето-
дов (VMT), одна для конкретного класса. Эта таблица содержит ука-
затели на код реализации методов данного класса. Когда в программе
вызывается виртуальный метод, то осуществляется обращение к
Таблице виртуальных методов того класса, объект которого в дан-
ный момент является активным. Затем по указателю таблицы нахо-
дится соответствующий код реализации вызванного метода и ему
передается управление;
   ƒ одноименные в разных классах методы (в нашем случае это
Show и Hide) описать как виртуальные (virtual).



                               108