Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 5.docx
Скачиваний:
1
Добавлен:
18.11.2019
Размер:
327 Кб
Скачать
☆

Мал. 2 Схема обмеження виклику перевизначених статичних методів

З нього видно істотне обмеження статичних методів: якщо метод (Met1 об'єкту Objname1) предка викликає інші методи (Met2), то це можуть бути тільки методи предка (objnamel .Met2), навіть якщо нащадок має свої власні методи з таким же ім'ям методу (objname2 .Met2). У прикладі лістингу оператор V2.Met1; викликає виконання методу Objnamel.Met1, який викликає метод Objnamel .Met2, не дивлячись на те що тип Objname2 має свій власний метод Objname2.Met2. Це відбувається тому що зв'язок об'єкту з методом проводився на етапі компіляції. Схематично це представлено на малюнку.

  1. Віртуальні методи і поліморфізм. Конструктор.

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

Здатність об’єктів похідних класів по-різному реагувати на ті самі повідомлення, називається поліморфізмом.

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

Віртуальний (що здається, гіпотетичний) метод має специфікатор (стандартну директиву) Virtual.

Наприклад:

Procedure Met2; Virtual;

Віртуальний метод призначений для перевизначення віртуального методу попереднього предка. Неприпустимо змішування статичних і віртуальних методів при їх перевизначені.

Обмеження: перевизначені віртуальні методи повинні мати такий самий набір формальних параметрів, як і найперший віртуальний метод багаторівневої ієрархії об'єктів.

Паскаль забезпечує виклик (скріплення) віртуального методу програми на етапі виконання програми. Це називають пізнім скріпленням. При пізньому скріпленні поліморфізм розповсюджується не тільки від поточного рівня ієрархії вниз, до нащадків (як для статичних методів), але і вгору, до предків.

Відповідно до цього основні відмінності перевизначення віртуальних методів від перевизначення статичних методів полягають в наступному:

  1. якщо для екземпляра нащадка методи предка викликають інші віртуальні методи, імена яких є в об'єкті-предку і в об'єкті-нащадку, то визиваються методи нащадка;

  2. віртуальні методи використовують пізнє пов'язання даних з методами, за допомогою яких вони оброблятимуться, тобто скріплення на етапі виконання програми.

Компілятор не встановлює зв'язку об'єкту з віртуальним методом. Замість цього він створює спеціальну таблицю віртуальних методів (ТВМ, VMT -virtual Method Table). Для кожного типу об'єкту створюється своя ТВМ; кожен екземпляр об'єкту використовує цю ТВМ, єдину для даного типу віртуальних об'єктів. У кожній ТВМ міститься розмір даного типу об'єкту в байтах. ТВМ будь-якого об'єкту доступна через прихований параметр Self, що містить адресу ТВМ, яка передається методу при виклику.

Скріплення кожного екземпляра об'єкту і його ТВМ здійснюється за допомогою конструктора на етапі виконання програми. Це спеціальний метод, подібний до звичайної процедури, але в заголовку замість PROCEDURE міститься слово CONSTRUCTOR.

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

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

Виклик конструктора повинен передувати виклику будь-якого віртуального методу для обробки даного екземпляра об'єкту. Звернення до віртуального методу до виклику конструктора викличе помилку на етапі виконання програми, оскільки немає зв'язку екземпляра об'єкту з його ТВМ.

При відладці програми можна використовувати директиву компілятора {$R+}. При цьому компілятор перевірятиме, чи ініціалізував екземпляр об'єкт, що викликає віртуальний метод. Якщо в процесі перевірки ініціалізації екземпляра об'єкту, що викликає віртуальний метод, буде виявлений виклик методу до ініціалізації об'єкту конструктором, видається повідомлення про фатальну помилку 210:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]