Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
9
Добавлен:
19.09.2019
Размер:
4.01 Mб
Скачать

6. В чому полягає принцип спадковості? Що таке одинична та множинна спадковості? Як реалізується принцип одиничної та множинної спадковості в об’єктно-орієнтованих мовах програмування?

Спадковість - можливість від існуючих класів породжувати дочірні класи.

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

Семантично, успадкування описує ставлення типу "is-a". Наприклад, ведмідь є ссавець, будинок є нерухомість і "швидке сортування" є сортуючим алгоритм. Таким чином, успадкування породжує ієрархію "узагальнення-спеціалізація", в якій підклас являє собою спеціалізований приватний випадок свого суперкласу. якщо B не є A, то B не варто робити від A.

Одиничне спадкування:

Множинне спадкування:

C

сlass A{

int a,b;};

сlass B:<ключ доступа> A

{ };

C

сlass A{};

сlass B{};

сlass C{};

сlass D:<ключ доступу> A, <ключ доступу> B, <ключ доступу> C

{ }; ключ доступу–public, private, protected

Delphi

Type

TMyClass = class (TObject)

a,b: Integer; c:word;

procedure p1; abstract;virtual;

procedure p2; abstract;virtual;

end;

TClass1 = class (TMyClass)

procedure p1; override;

procedure p2; override;

end;

Delphi

Type

A= class (TObject)

Procedure p1; abstract; virtual;

end;

B= class (TObject)

Procedure p3; abstract; virtual;

end;

TClass1 = class (A)

procedure p1; override;

obj:B;

end;

Є дві проблеми - конфлікти імен між різними суперкласами та повторне успадкування. Перший випадок, це коли в двох або більшій кількості суперкласів визначено поле чи операція з однаковим ім'ям. У C + + цей вид конфлікту має бути явно вирішений вручну, а в Smalltalk береться те, яке зустрічається першим. Повторне успадкування, це коли клас успадковує двох класів, а вони порізно успадкують один і той же четвертий клас. Виходить ромбова структура успадкування і треба вирішити, чи повинен самий нижній клас отримати одну або дві окремі копії самого верхнього класу?У деяких мовах повторне успадкування заборонено, в інших конфлікт вирішується "вольовим порядком", а в C + + це залишається на розсуд програміста

7. В чому полягає принцип інкапсуляції? Як реалізується принцип інкапсуляції в об’єктно-орієнтованих мовах програмування (охарактеризуйте директиви видимості, що застосовуються при описі класі)? Як регламентувати доступ до захищених полів об’єкта?

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

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

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

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

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

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

Поля, властивості та методи секції protected також доступні тільки всередині модуля з описуваних класом. Але, вони доступні і в класах, що є нащадками цього класу,в тому числі і в дру ¬ гих модулях.Нарешті, область видимості, що визначається четвертої директивою - pubLished, має особливе значення для інтерфейсу візуального проекту ¬ вання Delphi. У цій секції повинні бути зібрані ті властивості об'єкта, кото ¬ рые буде видно не тільки під час виконання програми, але й з се ¬ ди розробки.Три області видимості - private, protected, public - як би впорядковані по зростанню видимості методів. У класах-потомках можна підвищення ¬ сіть видимість методів і властивостей, але не погіршити її.При описі до ¬ чорного класу можна переносити методи і властивості з однієї сфери види ¬ мости в іншу, не перепісивая їх наново і навіть не описуючи - достатньо згадати про нього в іншому місці.

Приклад інкапсуляції та методів регламентації доступу до захищеніх полів об’єкта:

C

СlassA:<ключ доступу> B

{

private:

int a,b;

void Do_Something(void);

protected:

B::long c;

};

Delphi

TMyClass = class

private

FMyField: Integer;

Procedure SetMyField

(const Value: Integer);

function GetMyField: Integer;

public

property MyField: Integer

read GetMyField write

SetMyField;

end;

8. В чому полягає принцип поліморфізму? Як реалізується принцип поліморфізму в об’єктно-орієнтованих мовах програмування? Обґрунтуйте доцільність використання віртуальних або динамічних методів. Як здійснити виклик з методів потомка перекритих(віртуалізованих) методів предка?

Поліморфізм – можливість користуватися класами нащадками як класами предків.

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

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

При відсутності поліморфізму код програми змушено містить багато операторів вибору case або switch. Поліморфізм дозволяє обійтися без операторів вибору, оскільки об'єкти самі знають свій тип.

Метою поліморфізму, є використання одного імені для завдання загальних для класу дій. Виконання кожної конкретної дії буде визначатися типом даних. Наприклад, для мови С, в якому поліморфізм підтримується недостатньо, знаходження абсолютної величини числа вимагає трьох різних функцій: abs (), labs () і fabs (). Ці функції підраховують і повертають абсолютну величину цілих, довгих цілих і чисел із плаваючою точкою відповідно. В С + + кожна з цих функцій може бути названа abs (). Тип даних, який використовується при виклику функції, визначає, яка конкретна версія функції дійсно виконується. В С + + можна використовувати одне ім'я функції для безлічі різних дій. Це називається перевантаженням функцій (function overloading).

У більш загальному сенсі, концепцією поліморфізму є ідея "один інтерфейс, безліч методів". Поліморфізм може застосовуватися також і до операторів. Фактично у всіх мовах програмування обмежено застосовується поліморфізм, наприклад, в арифметичних операторах. Так, в С, символ + використовується для складання цілих, довгих цілих, символьних змінних і чисел із плаваючою точкою. У цьому випадку компілятор автоматично визначає, який тип арифметики потрібно. В С + + ви можете застосувати цю концепцію і до інших, заданих вами, типів даних. Такий тип поліморфізму називається перевантаженням операторів (operator overloading).

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

Приклад. Клас геометричних фігур (еліпс, багатокутник) може мати методи для геометричних трансформацій (зсув, поворот, масштабування).

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

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

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

Коли з класу-нащадка необхідно викликати однойменний метод предка, що був заміщеній (або перекритий) цим нащадком. Для цього використовується спеціальна директива inherited. Загальний опис використання такий:

inherited < ім’я методу предка>;

9. Призначення параметризованих функцій та параметризованих класів. У яких випадках доцільно використовувати параметризовану функцію, а у яких групу перевантажених функцій. Призначення класів-шаблонів та їх використання. Як на UML діаграмі класів відображаються параметризовані класи?

Параметрізованние класи. У деяких об'єктно-орієнтованих мов програмування, зокрема, C + +, Eiffel та Ada можна створювати параметрізованние класи. параметрізованним класом називається сімейство класів із загальною структурою і поведінкою.Щоб створити конкретний клас цього сімейства, потрібно підставити замість формальних параметрів фактичні (процес інстанцірованія). Конкретний клас може породжувати екземпляри.

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

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

Параметрізованний клас не може породжувати примірники і не може використовуватися сам в якості параметра.Кожен інстанцірованний клас є новим класом, відмінним від інших конкретних класів того ж сімейства.

Инстанцирование.

Відносини між параметрізованним класом Queue, його інстанцірованіем для класу DisplayItem і примірником itemQueue.

В Pascal параметризованих функцій і класів немає. У С++ це родові функції і класи. Родова функція визначає базовий набір операцій, кіт будуть застосуються до різних типів даних. Родова функція оперує з тим типом даннях, який вона отримує як параметра. За допомогою цього механізму одна і та ж процедура може застосуються до самих різних типів даннях. Завдяки створенню родовий функції ми можемо не залежно від типа даннях визначити суть алгоритму. Після того, як це зроблено, компілятор автоматично генерує правильний код для фактично використовуваного при виконанні функції типа даних. По суті, при створенні родової функції ви створюєте функцію, котра може автоматично перевантажуватися сама. Родова функція створюється за допомогою ключового слова template. Воно призначене для створення шаблону, який описує те, що робитиме функція, при цьому компілятору залишається доповнити шаблон необхідними деталями. На додаток до родових функції визначені родові класи(класи-шаблони). За допомогою родового класу можна створити клас, що реалізовує чергу, зв’язані списки т.д. для будь-яких типів даних. Компілятор автоматично генеруватиме правильного типа об'єкту на основі типа, заданого при створенні об'єкту. Бібліотека стандартних шаблонів (STL). Ядро STL образу ют 3 елементи: контейнери (об'єкти призначені для зберігання інших об'єктів), алгоритми і ітератори. Контейнери бувають різних типів. Наприклад в класі-контейнері vector (вектор) визначається динамічний масив. У класі тap – асоціативний список для зберігання пар ключ/значення, де з кожним ключем пов'язано лише одне значення. У класі stek – визначається стек. У разі, коли функція виконуватиме різні алгоритми, коли до неї на вхід подаватимуться змінні різних типів – використовуємо переобтяжені функції, якщо ж функція не дивлячись на те який тип змінної подається їй на вхід виконує один і той же алгоритм, то використовуємо функцію, що параметризується.

Ім’я класу

Поля

Методи

10. Охарактеризуйте принцип об’єктно-орієнтованого програмування – абстрагування. Дайте визначення інтерфейсу як елементу об’єктно-орієнтованих мов програмування. Як створити клас, що реалізує декілька інтерфейсів? Як на UML діаграмі класів відображаються інтерфейси?

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

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

  • Абстракція суті – Об'єкт представляє собою корисну модель якоїсь сутності в предметній області

  • Абстракція поведінки – Об'єкт складається з узагальненої безлічі операцій

  • Абстракція віртуальної машини – Об'єкт групує операції, які або разом використовуються більш високим рівнем управління, або самі використовують певний набір операцій більш низького рівня

  • Довільна абстракція – Об'єкт включає в себе набір операцій, що не мають між собою нічого спільного

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

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

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

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

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

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

Ми можемо розділити інтерфейс класу на три частини:

• відкриту (public) - видиму всім клієнтам;

• захищену (protected) - видиму самому класу, його підкласу і друзям (friends);

• закриту (private) - видиму тільки самому класу та його друзям.

Квантор видимості може приймати одне з трьох можливих значень і, відповідно, відображається за допомогою спеціальних символів:

  • Символ "+" означає атрибут з областю видимості типу загальнодоступний (public).Атрибут з цією областю видимості доступний або видно з будь-якого іншого класу пакета, в якому визначена діаграма.

  • Символ "#" означає атрибут з областю видимості типу захищений (protected).Атрибут з цією областю видимості недоступний або невидимий для всіх класів, за винятком підкласів даного класу.

  • І, нарешті, знак "-" означає атрибут з областю видимості типу закритий (private). Атрибут з цією областю видимості недоступний або невидимий для всіх класів без винятку.

11. Охарактеризуйте поняття раннього та пізнього зв’язування методів. Для яких методів об’єкта застосовується раннє, а для яких пізнє зв’язування? Чим відрізняється виклик перекритих методів від виклику віртуальних(динамічних) методів? Чим відрізняється виклик віртуальних та динамічних методів між собою?

Раннє зв’язування вик-ся для статичних методів, пізнє зв’язування–для заміщуваних. Раннє зв’язування-компілятор визначає адресу і передає її об’єкту. Таким чином зв'язок об’єктів зі своїм статичним методом відбувається на етапі компіляції. Пізнє зв’язування – настроювання об’єкта на заміщуваний метод класу відб-ся під час ініціалізації об’єкта. Коли компілятор зустрічає звернення до заміщуваного метода, він підставляє замість звернення до конкретної адреси код, який звертається до спец. таблиці (VMT, DMT), звідки потім витягається потрібна адреса. Отже, для заміщуваних методів звязування відбувається під час виконання (ініціалізації об’єкта - пізнє зв’язування.

Різниця між заміщ. І статичн. Методами:

1)при описі у класі-предку ЗМ описуються директивою virtual або dynamic. У класі-нащадку – override.

2)ЗМ дають можливість об’єктам-батькам викликати методи об’єктів-нащадків.та в

Різниця виклику перекритих методів від виклику віртуальних в тому, що в перекриття методів батьківського класу відбувається при співпаданні імені дочірнього класу і іменами батьківського класу і виклик методу батьківського класу можна робити в дочірньому, а віртуальні запам’ятовують адресу батьківського класу аж до TObject.

Для віртуальних і динамічних методів, коли метод перекривається треба в (нащадку вказати слово) методі нащадку потрібно вказати службове слово Override.

Різниця між віртуальними та динамічними методами – в структурі відповідних даним методам таблиць. Для вірт. методів Форм-ся таблиця віртуальних методів. Така таблиця існує для кожного класу об’єктів. До неї заносяться адреси всіх віртуальних методів не залежно успадковані ці методи від предка чи перекриті. Кожному динамічному методу присвоюється унікальний індекс. В таблиці динамічних методів класу зберігаються індекси тільки тих методів, які описані у даному класі. Під час виклику динамічного методу відб-ся пошук в цій таблиці, в разі невдачі передивляються всі класи-предки за ієрархією. Виклик вірт методів відб-ся швидше, але потребує більше памяті