Ноу Інти, лекція, ієрархії об’єктів
Продовжимо тестування об'єкта daemon. вставивши в наведену вище програму перед першою з процедур readln виклики методів, успадкованих з об'єкта monster.
Vasia.move (200, 100); Vasia.move (200, 200); Vasia. hit;
Результати запуску програми розчаровують: на екрані з'являється зображення не демона, а монстра - символ @. Значить, з методу move викликаються методи малювання і стирання об'єкта-предка. Та й метод атаки, що викликається з hit. судячи з діагностичного повідомленням, також належить об'єкту monster. Щоб розібратися, чому це відбувається, розглянемо механізм роботи компілятора.
Таким чином, при компіляції методу move об'єкта monster на місце виклику методів erase і draw вставляються переходи на перші виконувані оператори цих методів з об'єкта monster. Викликавши метод move з будь-якого нащадка monster. ми в будь-якому випадку потрапимо в методи erase і draw об'єкта monster. тому що вони жорстко пов'язані один з одним ще до виконання програми (рис. 7.1).
Аналогічна ситуація і з методом attack. Якщо він викликається безпосередньо для екземпляра об'єкта daemon. то все в порядку, але викликати його з методу hit. описаного в об'єкті-предка, неможливо, тому що при компіляції методу hit в нього була вставлена передача управління на метод attack об'єкта monster (рис. 7.1).
Цей механізм називається раннім зв'язуванням. так як всі посилання на підпрограми компілятор дозволяє до виконання програми. Ясно, що за допомогою раннього зв'язування не вдасться забезпечити можливість виклику з однієї і тієї ж підпрограми методу то одного об'єкта, то іншого. Це можна зробити тільки в разі якщо посилання будуть вирішуватися на етапі виконання програми в момент виклику методу. Такий механізм в Паскалі є: він називається пізнім зв'язуванням і реалізується за допомогою так званих віртуальних методів. Але перед тим як зайнятися їх вивченням, треба розглянути питання про сумісність типів об'єктів.
Сумісність типів об'єктів
Паскаль - мова зі строгою типізацією. Операнди, які беруть участь у виразах, параметри підпрограм і їх аргументи, ліва і права частини оператора присвоювання повинні підкорятися правилам відповідності типів. Для об'єктів поняття сумісності розширено: похідний тип сумісний зі своїм батьківським типом. Ця розширена сумісність типів має три форми:
- між екземплярами об'єктів;
- між покажчиками на екземпляри об'єктів;
- між параметрами і аргументами підпрограм.
У всіх трьох випадках сумісність одностороння: батьківському об'єкту може бути присвоєно екземпляр будь-якого з його нащадків. але не навпаки. Це пов'язано з тим, що при присвоєнні повинні бути заповнені всі поля, а нащадок має або такий же розмір, як предок, або більший.
Наприклад, якщо визначено змінні: