Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

OneCircle

 

 

 
 

 


Теперь рассмотрим вызов метода

OneCircle.Move (10, 20);

Экземпляр типа-потомка вызывает унаследованный метод Move, который жестко связан с методом TPoint.SwitchOff, так как и SwitchOff, и Move были откомпилированы в одном контексте в объектном типе Point. Поэтому метод Move всегда будет вызывать метод TPoint.SwitchOff. Связь этих методов является статической, так как она была определена при компиляции. Таким образом, последний вызов, так же, как и первый, приведет к перемещению на экране точки. Круг при этом передвинут не будет, так как метод TCircle.SwitchOff (и, далее, метод TCircle.SwitchOn) не будет вызван. Цепочка вызовов, соответствующая второму примеру, отмечена буквой В.

Предыдущие рассмотрения приводят к мысли о том, что если мы хотим иметь один метод Move для различных объектных типов, то необходимо, во-первых, разорвать статическую связь этого метода с методом TPoint.SwitchOff, либо методом TCircle.SwitchOff в зависимости от того, какой объект вызывает Move. Такой механизм называется динамическим или поздним связыванием (в противоположность статическому, или раннему связыванию, показанному выше) и достигается введением виртуальных методов.

Не останавливаясь на технической стороне вопроса (как это реализовано в языке Turbo Pascal), покажем, как записываются и как работают виртуальные методы. Для того, чтобы определить виртуальный метод, необходимо указать после его заголовка в объектовом типе служебное слово virtual. При этом во всех потомках объектового типа одноименные (переопределяющие) методы должны также специфицироваться как виртуальные; кроме того, все они должны иметь точно такой же набор формальных параметров, что и самый первый виртуальный метод. Возвращаясь к нашему примеру, можно следующим образом определить типы TPoint и TCircle (несущественные для рассмотрения поля и методы заменены многоточиями):

type

TPoint = object

....

constructor Create (a, b: integer);

procedure SwitchOn; virtual;

procedure SwitchOff; virtual;

procedure Move (dx, dy: integer);

...

end;

 

TCircle = object (Point)

...

constructor Create (a, b, R: integer);

procedure SwitchOn; virtual;

procedure SwitchOff; virtual;

...

end;

Полные описания методов SwitchOn и SwitchOff в обоих типах остаются неизменными.

После таких описаний цепочки вызовов для обращений

OnePoint.Move (10, 20);

OneCircle.Move (10, 20);

можно проиллюстрировать следующей схемой:

 

 

OnePoint A

 
 

 


A

 

A

 

<== предыдущая лекция | следующая лекция ==>
Виртуальные методы | Конструкторы и деструкторы. Динамические объекты
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 361; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.