Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

B.SETCOORD(200,200);

B.SETR(20);

B.SETCOL(6);

B.ON;

B.RUH(50,50);

Перші чотири оператори відобразять коло радіусом 20 точок за в точці (200, 200) з кольором 6, потім метод рух перемістить раніше розглянуту точку а в центр кола. Таке явище пов’язане із специфічною ситуацією компіляції та виконання програми, що називається раннім зв’язуванням коду методу із іменем об’єкта.

Звернення до ruh призводить до пошуку в межах коду об’єкта в класі circle. Реалізація методу явно відсутній в структурі класу circle, а успадковується від point, то компілятор здійснює пошук коду цього методу у предка. Знайшовши цей метод компілятор передає управління у код об’єкта класу point.

Виконання методу ruh пов’язаний із трьома діями, хоча методи ON i OFF є перевизначеними у circle, проте виявляється, що виконуються не вони, а методи класу предка. Така послідовність дій виключить точку з координатами (150,150) і включить її в координати (200,200), а коло залишиться нерухомим. В цьому випадку не спрацювали перевизначені методи ON та OFF у класі circle. Це пов’язано з тим, що вони входять в реалізацію методу ruh класу point, а отже „жорстко зв’язані” з іменем цього об’єкта (раннє зв’язування).

Якщо ж по-окремо виконати наступні дії:

B.OFF;

B.SETCOORD(50,50);

B.ON;

то дійсно переміститься коло. В цьому випадку спрацюють власні методи, оскільки вони пов’язані з іменем об’єкта b.

Щоб уникнути подібної ситуації, пов’язаної з раннім зв’язуванням кодів перевизначених методів з іменами даних об’єктів, використовують віртуальні методи. В даному випадку віртуальними методами мають бути ON і OFF.

TYPE

POINT=object

x,y:integer;

c:byte;

f:boolean;

PROCEDURE SETCOORD (xx,yy:integer);

PROCEDURE SETCOL (cc:byte);

FUNCTION GETXX: integer;

FUNCTION GETYY: integer;

PROCEDURE ON; virtual;

PROCEDURE OFF;virtual;

PROCEDURE RUH(dx,dy:integer);

END;

Віртуальні методи вже будуть працювати по-своєму для кожного класу, тобто при виклику методу b.RUH, спочатку відбудеться передача управління у код об’єкта класу point, оскільки перший із методів у реалізації RUH є перевизначеним віртуальним методом OFF, то відбудеться повернення у код об’єкта класу circle (спрацьовує власний OFF).

Код віртуального методу не зв’язується з іменем об’єкта на етапі компіляції. Для віртуальних методів формується так званий пізній зв’язок на етапі виконання програми, в залежності від того, у якому контексті цей метод викликається.

Використання віртуальних методів передбачає декілька стандартних правил:

Віртуальним варто оголошувати лише той метод, який:

а). перевизначається у кожному нащадку, тобто в кожному працює по-своєму;

б). входить у склад реалізації іншого методу у предку;

в). містить у реалізації віртуальній, має успадкуватися нащадками без пере визначення.

„Один раз віртуальний – все життя віртуальний”. Це означає, що на деякому рівні ієрархії класів певний метод був оголошений віртуально, то на всіх нижчих видів ієрархії, тобто у всіх нащадках цей метод повинен перевизначеним і віртуальним.

Віртуальні методи можуть працювати дійсно як віртуальні або як звичайні методи. Необхідний режим пізнього зв’язування, якщо ж цього режиму немає, то віртуальний метод працює як звичайно.

Тема: Конструктори та деструктори.

Вище було сказано, що віртуальність методу залежить від режиму зв’язування коду методу із іменем об’єкта. Перемикання режимів раннього і пізньог7о зв’язування здійснюється за допомогою застосування спеціальних методів, що називаються конструкторами та деструкторами.

Метод конструктор використовується для активізації режиму пізнього зв’язування, після явного виклику одного із конструкторів деякого об’єкта. Всі методи, які оголошуються як віртуальні будуть працювати як віртуальні.

Конструктор оголошується за допомогою службового слова CONSTRUCTOR, що замінює procedure або function відповідно. Все решта в оголошенні методу залишається без змін.

В якості конструктора переважно використовують якийсь із ініціалізуючих методів об’єкта, проте конструктор може мати пусту ініціалізацію, тобто цей метод нічого не робить, окрім включення пізнього зв’язування.

TYPE

POINT=object

x,y:integer;

c:byte;

f:boolean;




Дата добавления: 2015-09-11; просмотров: 7 | Поможем написать вашу работу | Нарушение авторских прав

Заголовок. | Xx: real; | Rewrite (Output); | Процедура | Процедура | Процедура | Процедури обслуговування переривань. | Процедура | Процедура | B.RUH(-50,-50); |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав