Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
9
Добавлен:
19.09.2019
Размер:
4.01 Mб
Скачать
  1. Опишіть внутрішню структуру об’єкта. Що таке інформація про тип під час виконання rtti і як вона використовується?

RTTI (Run time type information) - це механізм, що дозволяє визначити тип даних під час виконання. Суть його в тому, що компілятор генерує розширену інформацію для майже всіх класів, що використовуються у програмі, тільки для класів, оголошених з директивою ($ M +) та їхніх нащадків. Ця інформація активно використовується самим середовищем розробки (інспектор об'єктів, редактори властивостей) і може бути використана програмістом. Необхідні засоби для роботи з RTTI знаходяться в модулі TypInfo.pas. RTTI дозволяє одержати інформацію про властивості і методи, оголошених ТІЛЬКИ у роздiлi published.

var

TypeData: PTypeData;

PropList: PPropList;

Count,i: Integer;

Begin

TypeData:=GetTypeData(ClassInfo); // Получаем указатель на информацию

Count:=TypeData.PropCount; // Получаем количество свойств

GetMem(PropList,SizeOf(PPropInfo)*Count);//Выделяем память для списка свойств

GetPropInfos(ClassInfo,PropList); //Получаем список свойств

End;

Класи: type TFirstClass = class

Покажчик на об’єкт ---покажчик на клас – RTTI класу (32байтипокажчиків )

type TClass = class of TObject;

function ClassType: TClass;

class function ClassName: ShortString;

class function ClassParent: TClass;

Цей приклад показує, як отримати родовід від одного з компонентів з використанням ClassType і ClassParent властивості. Він використовує кнопки і список поле форми. Коли користувач натискає на кнопку, назва кнопки класу і прізвища його батьків класів будуть додані в список.

procedure TForm1.Button1Click(Sender: TObject);

var

ClassRef: TClass;

begin

ListBox1.Clear;

ClassRef := Sender.ClassType;

while ClassRef <> nil do

begin

ListBox1.Items.Add(ClassRef.ClassName);

ClassRef := ClassRef.ClassParent;

end;

end;

Об’єкти (або екземпляри класів 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 здійснюється через покажчик на клас або виклик класових методів.

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

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

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

Процес розробки програм в середовищі Borland / Inprise Delphi також тісно пов'язаний з використанням бібліотеки стандартних класів - VCL (Visual Component Library) або бібліотеки візуальних компонентів.Ця бібліотека теж побудована по ієрархічному принципу, згідно з яким компоненти ніжележащіх рівнів вспадкують властивості та методи вишележащіх компонентів.

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

Інваріанти - це якийсь логічний умова, значення якого (істина чи брехня) повинно зберігатися.Для кожної операції об'єкта можна задати Передумови (інваріанти передбачувані операцією) і постусловія (інваріанти, яким задовольняє операція). Зміна інваріанти порушує контракт, пов'язаний з абстракцій.

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

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

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

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

Ієрархія - це впорядкування абстракцій, розміщення їх по уровням.

Приклади ієрархії: одиночное успадкування. Важливим елементом об'єктно-орієнтованих систем і основним видом ієрархії "is-a" є згадувана вище концепція успадкування.Успадкування означає таке відношення між класами (відношення батьків / нащадок), коли один клас запозичує структурну або функціональну частина одного або декількох інших класів (відповідно, одиночное і множинне успадкування).Іншими словами, успадкування створює таку ієрархію абстракцій, в якій підклас вспадкують будову від одного або декількох суперклассов. Часто підклас достраивает або переписує компоненти вищого класу.

множинне успадкування.У ряді випадків корисно реалізувати успадкування від декількох суперклассов.

Під поліморфізмом (грец. Poly-багато, morfos - форма) розуміють властивість деяких об'єктів приймати різні зовнішні форми в залежності від обставин.Стосовно до ООП поліморфізм означає, що дії, що виконуються однойменною методами, можуть відрізнятися в залежності від того, якому з класів відноситься той чи інший метод, тобто можливість користуватися класами нащадками як класами предків.

Спадковість - можливість від існуючих класів породжувати дочірні класи, тобто властивість об’єктів одного класу базуватися на властивостях іншого.