Ім'я останнього вказується в круглих дужках після слова object. З методів спадкоємця можна викликати методи батька. Для створення спадкоємця не вимагається мати вихідний текст об'єкта батька. Об'єкт-батько може бути вже в складі оттранслировать модуля.
У чому привабливість наслідування? Якщо якийсь об'єкт був уже визначений і налагоджений, він може бути використаний і в інших програмах. При цьому може виявитися, що нова задача відрізняється від попередньої, і виникає необхідність деякої модифікації як даних, так і методів їх обробки. Програмісту доводиться вирішувати дилему - створення об'єктів заново або використовувати результати попередньої роботи, застосовуючи механізм спадкоємства. Перший шлях менш ефективний, оскільки вимагає додаткових витрат часу на налагодження і тестування. У другому випадку частину цієї роботи виявляється виконаною, що скорочує час на розробку нової програми. Програміст при цьому може і не знати деталей реалізації об'єкта-батька.
У нашому прикладі до об'єкта, пов'язаному з визначенням положення графічного елементу, просто додалося нове поле, що описує ознака видимості графічної точки, і кілька нових методів, пов'язаних з режимом відображення точки і її перетвореннями.
. Віртуальні методи
Успадкування дозволяє створювати ієрархічні, пов'язані відносинами підпорядкування, структури даних. Слід, однак, зауважити, що при використанні цієї можливості можуть виникнути проблеми. Припустимо, що в нашій графічній програмі необхідно визначити об'єкт Circle, який є нащадком іншого об'єкта Point:
Type=bject (point): Integer; Show; Hide; Expand (ExpandBy: Integer); Contact (ContactBy: Integer) ;;
Новий об'єкт Circle відповідає окружності. Оскільки властивості окружності відрізняються від властивостей точки, в об'єкті-спадкоємця доведеться змінювати процедури Show і Hide, які відображають коло і видаляють її зображення з екрану. Може виявитися, що метод Init (див. Попередній приклад) об'єкта Circle, успадкований від об'єкта Point, також використовує методи Show і Hide, надалі під час трансляції об'єкта Point використовує посилання на старі методи. Очевидно в об'єкті Circle вони працювати не будуть.
Можна, звичайно, спробувати «перекрити» метод Init. Щоб це зробити, нам доведеться повністю відтворити текст методу. Це ускладнить роботу, та й не завжди можливо, оскільки вихідного тексту програми може не виявитися під рукою (якщо об'єкт-батько вже знаходитися в оттранслировать модулі).
Для вирішення цієї проблеми використовується віртуальний метод. Зв'язок між віртуальним методом і зухвалими їх процедурами встановлюється не під час трансляції (це називається раннім зв'язаність), а під час виконання програми.
Щоб використовувати віртуальний метод, необхідно в описі об'єкта після заголовка методу додати ключове слово virtual. Заголовки віртуальних методів батька і спадкоємця повинні в точності збігатися. Ініціалізація примірника об'єкта, що має віртуальні методи, повинна виконуватися за допомогою спеціального методу - конструктора. Конструктор зазвичай присвоює полях об'єкта початкові значення та виконує інші дії з ініціалізації об'єкта. У заголовку методу-конструктора слово procedure замінюється словом constructor. Дії зворотні діям конструктора, виконує ще один спеціальний метод - деструктор. Він описується словом destructor.
Конструктор виконує дії з підготовки пізнього зв'язування. Ці дії полягають у створенні покажчика на таблицю віртуальних методів, яка в подальшому використовується для пошуку методів. Таблиця містить адреси усіх віртуальних методів. При виклику віртуального методу по його імені визначається адресу, а потім за цією адресою передається керування.
У кожного об'єктного типу є своя власна таблиця віртуальних методів, що дозволяє одному і тому ж оператору викликати різні процедури. Якщо є декілька екземплярів об'єктів одного типу, то недостатньо викликати конструктор для одного з них, а потім просто скопіювати цей екземпляр в усі інші. Кожен об'єкт повинен мати свій власний конструктор, який викликається для кожного екземпляра. В іншому випадку можливий збій у роботі програми.
Зауважимо, що конструктор або деструктор, можуть бути «порожніми», тобто не містити операторів. Весь необхідний код в цьому випадку створюється при трансляції ключових слів construct і destruct.
. Динамічне створення об'єктів
Змінні об'єктного типу можуть бути динамічними, тобто розміщуватися в пам'яті тільки під час їх використання. Для роботи з динамічними об'єктами використовуються розширений синтаксис процедур New і Dispose. Обидві процедури в цьому випадку містять в ...