Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектування інформаційних систем.doc
Скачиваний:
94
Добавлен:
21.09.2019
Размер:
28.77 Mб
Скачать

15.4.6. Метакласи

Як було сказано, будь-який об'єкт є екземпляром якого-небудь класу. Що буде, якщо ми спробуємо із самими класами поводитись як з об'єктами? Для цього нам треба відповістити на запитання, що ж таке клас класу? Відповідь - це метаклас. Іншими словами, метаклас - це клас, екземпляри якого є класи.

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

У мовах типу Smalltalk первинне призначення метакласу - підтримка змінних класу (які є загальними для всіх екземплярів цього класу), операції ініціалізації змінних класу й створення одиничного екземпляра метакласу. Метаклас Smalltalk містить приклади використання його класів. Наприклад, як показано на рис. 15.11, ми могли б задати змінну класу nextId для метакласу TelemetryData, щоб виробляти ідентифікуючі мітки при створенні кожного екземпляру TelemetryData. Аналогічно, ми могли б визначити оператор утворення нових екземплярів класу, який би їх створював у деякій наперед виділеній пам'яті.

Рис. 15.11. Метакласи.

Хоча в C++ метакласів немає, семантика його конструкторів і деструкторів служить цілям, аналогічним до тих, що викликали існування метакласів. C++ має засоби підтримки й змінних класу, і операцій метакласу. В C++ можна описати члени даних або функції класу як статичні (static), що буде означати: цей елемент є загальним для всіх екземплярів класу. Статичні члени класу в C++ еквівалентні змінним класу в Smalltalk. Статична функція-член класу відіграє роль операцій метакласу в Smalltalk.

Як ми вже відзначали, в CLOS апарат метакласів ще потужніший, ніж в Smalltalk. Через нього можна змінювати саму семантику елементів: слідування класів, узагальнені функції й методи. Головна перевага - можливість експериментувати з іншими об’єктно-орієнтованими парадигмами й створювати такі інструменти для розробника, як браузери класів і об'єктів.

В CLOS є визначений клас із іменем standard-class, який є метакласом для всіх нетипізованих класів, визначених за допомогою defclass. У цьому метакласі є метод make-instance, який створює екземпляри. Крім того, у ньому визначена вся техніка роботи зі списком слідування класів. Все це можна змінити.

Методи й узагальнені функції в CLOS теж можна розглядати як об'єкти. Тому що вони трохи відрізняються від звичайних об'єктів. В сукупності об'єкти, що відповідають класам, методам і узагальненим функціям, називаються метаоб’єктами. Кожний метод є екземпляром визначеного класу standard-method, а кожна функція є екземпляром визначеного класу standard-generic-function. Оскільки поведінку цих визначених класів можна змінити, вдається впливати на трактування методів і узагальнених функцій.

15.5. Взаємозв'язок класів і об'єктів

15.5.1. Відношення між класами й об'єктами

Класи й об'єкти - це окремі, але тісно зв'язані поняття. Зокрема, кожний об'єкт є екземпляром якого-небудь класу; клас може породжувати будь-яке число об'єктів. У більшості практичних випадках класи статичні, тобто всі їх особливості й зміст визначені в процесі компіляції програми. Із цього випливає, що будь-який створений об'єкт відноситься до строго фіксованого класу. Самі об'єкти, навпаки, у процесі виконання програми створюються й знищуються.

Як приклад розглянемо класи й об'єкти для задачі керування повітряним рухом. Найважливіші абстракції в цій сфері - літаки, графіки польотів, маршрут і коридори в повітряному просторі. Трактування цих класів об'єктів за самим їх визначенням досить статичне. Інакше неможливо було б побудувати ніякої інформаційної системи, яка використовує такі загальнозрозумілі факти, як такі, що літаки можуть злітати, літати й приземлятися, а також що ніякі два літаки не повинні перебувати одночасно в одній і тій же точці.

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