Опишіть внутрішню структуру об’єкта. Що таке інформація про тип під час виконання rtti І як вона використовується. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Опишіть внутрішню структуру об’єкта. Що таке інформація про тип під час виконання rtti І як вона використовується.



Внутрішня структура об’єкта. Реалізація TVM та TDM.

Об’єкти (або екземпляри класів TFirstClass та TSecondClass) Obj1 та Obj2 є покажчиками на область пам’яті, яка розподілена для збереження полів об’єкту. Ця область містить копії полів класу. Крім того кожний екземпляр класу містить покажчик на його клас (розмір – 32 байта), де сконцентрована вся інформація безпосередньо про клас та посилання на методи. Інформація про клас це спеціальна 32 – байтна структура, яка інакше називається інформація про тип під час виконання (runtime type information – RTTI). Вона містить всі дані про клас: його ім’я, розмір екземпляру, покажчик на клас – предок, адресу таблиці динамічних методів та інше. Далі розташована таблиця віртуальних методів (TVM) класу, яка містить адреси всіх віртуальних методів для даного класу. Для виклику віртуального метода компілятор генерує код, що виконує безумовний перехід за адресою, що вказана у відповідній комірці цієї таблиці. TVM дає можливість швидкого виклику метода, але недоліком є те, що для кожного дочірнього класу в його TVM копіюються посилання на всі віртуальні методи предків, навіть якщо вони не були перевизначені, що значно збільшує об’єм пам’яті для збереження TVM. Адреси VirtMethod2 для обох класів будуть однакові, але адреси для VirtMethod1 будуть різні. На відміну від віртуальних посилання на динамічні методи більш економно розташовуються в пам’яті. Для кожного класу у таблиці динамічних методів (TDM) зберігається посилання тільки на методі перевизначені для даного класу. Крім того виклик цих методів здійснюється за допомогою унікального номера (індексу), що визначає метод. Відповідно до цього пошук динамічного методу здійснюється довше, ніж віртуального. Що краще віртуальний або динамічний метод: якщо метод скоріше за всього буде перевизначений майже всіма нащадками, він має бути віртуальним; якщо метод, буде перекриватися не дуже часто, але вимагає пізнього зв’язування для більшої гнучкості, зробіть його динамічним, особливо якщо для класу планується значна кількість нащадків;якщо метод буде викликатися дуже часто, багато разів на секунду, зробіть його віртуальним. Структура RTTI містить: короткий покажчик на додаткову інформацію про клас, короткий покажчик на таблицю інформації про поля, короткий покажчик на рядок з ім’ям класу, розмір екземпляра класу, покажчик на клас – предок, покажчик на конструктор, покажчик на деструктор. Інформація RTTI може використовуватися програмістом явно чи неявно. Маючи справу з поліморфізмом та ієрархією класів, часто виникає необхідність визначити тип об'єкту, на який вказує покажчик об'єкту. В Delphi оператор is забезпечує доступ до RTTI для визначення того, чи є тип об'єкту типом даного класу, або одним з його нащадків.

is - логічна операція, операндами якої є екземпляр об'єкту і класовий тип. Результат операції булового типу. Delphi використовує оператор as для приведення типу. Після застосування оператора as самий об'єкт не змінюється, але викликаються ті його методи, як якби він належав до приведеного класу. Інформація RTTI може використовуватися незалежно від того створено екземпляр класу чи ні. В такому випадку доступ до RTTI здійснюється через покажчик на клас або виклик класових методів.

 

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

Для забезпечення надійності не бажаний прямий доступ до полів об'єкта: читання та оновлення їх вмісту повинне здійснюватися за допомогою виклику відповідних методів. Це правило і є інкапсуляція.

У моделі об'єктів мови Object Pascal існує механізм доступу до частин об'єкта, що визначає області, де ними можна користуватися (області видимості). Поля і методи можуть ставитися до чотирьох груп (секціями), відмінним областями видимості. Методи і поля можуть бути загальними (секція public), особистими (секція private), захищеними (секція protected) та опублікованими (секція published), для створення OLE об'єктів (секція automized). Поля, властивості та методи секції public не мають обмежень на видимість. Вони доступні з інших функцій і методів об'єктів, як у даному модулі, так і у всіх інших, які посилаються на нього. Поля, властивості та методи, що знаходяться в секції private, доступні лише в методах класу та у функціях, що містяться в тому ж модулі, що і стосуються клас. Поля, властивості та методи секції protected також доступні тільки всередині модуля з описуваних класом. Але, вони доступні і в класах, що є нащадками даного класу, в тому числі і в інших модулях. Область видимості, що визначається четвертої директивою - pubLished, має особливе значення для інтерфейсу візуального проектування Delphi. У цій секції повинні бути зібрані ті властивості об'єкта, які буде видно не тільки під час виконання програми, але й з середовищі розробки.

Принцип успадкування означає, що якщо ви хочете створити новий клас, лише трохи відрізняється від старого, то абсолютно немає необхідності в переписування заново вже існуючих полів і методів. Ви розкажете, що новий классTNewObject = class (TOldObject); є нащадком або дочірнім класом старого класу TOldObject, званого предком або батьківським класом, і додати до нього нові поля, методи і властивості. Успадковані від класу-предка поля і методи доступні в дочірньому класі; якщо має місце збіг імен методів, то говорять, що вони перекриваються. Мова C + + допускає так зване множинне успадкування. У цьому випадку новий клас може успадковувати частину своїх елементів від одного батьківського класу, а частина - від іншого. Множинне успадкування створює відому проблему (в C + +), коли клас успадковується від декількох класів-посередників, які у свою чергу успадковуються від одного класу. Якщо метод загального предка був пере визначено в посередниках, невідомо, яку реалізацію методу повинен наслідувати загальний нащадок. Вирішується ця проблема шляхом відмови від множинного успадкування для класів і роздільною здатністю множинного спадкоємства для повністю абстрактних класів (т. н. Інтерфейсів) (C #, Delphi, Java). В Object Pascal поняття множинного наслідування відсутнє. Якщо ви хочете, щоб новий клас об'єднував властивості кількох, створити класи-предки один від іншого, або включити в один клас кілька полів, що відповідають іншим бажаних класами.

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

В об'єктно-орієнтованих мовах клас є типом даних. Поліморфізм реалізується за допомогою успадкування класів. Клас-нащадок успадковує сигнатури методів класу-батька, але реалізація цих методів може бути іншою, що відповідає специфіці класу-нащадка. Це називається пере визначення методу. Статичні методи повністю перекриваються у класах-потомках при їх пере визначення. При цьому можна повністю змінити оголошення методу. Віртуальні (virtual) і динамічні (dynamic) при спадкуванні повинні зберігати назву і тип. Перезавантажені (overload) методи доповнюють механізм успадкування можливістю використовувати потрібний варіант методу (власний або батьківський) в залежності від умов застосування. Класові методи (class) - Класові методи можна викликати без створення екземпляри класу, а через посилання на клас. Хоча класові методи можна викликати також з екземпляри об'єкту, але реалізація класовою методів не може посилатися на конкретне поле, або інший некласовій метод. На конструктор та на інші класові методи посилатися можна. Класові методи, зазвичай, модифікують глобальні дані або видають інформацію про клас.

Абстрактні методи не мають реалізації взагалі. Вони спеціально призначені для наслідування. Їх реалізація повинна бути визначена в класах-нащадках. Віртуальні методи - займають більше місця, але швидше обробляються. Динамічні - менше місця, але повільніше обробляються.

Абстрагування полягає у відділенні інтерфейсу від реалізації.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-07; просмотров: 24; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.111.125 (0.005 с.)