Лекція 17 Об'єктні типи. При розробці мови Borland Pascal 0 використана логічно завершенна, але найпростіша об'єктна модель. У цій моделі



Скачати 72.28 Kb.
Дата конвертації30.12.2016
Розмір72.28 Kb.
Лекція 17
Об'єктні типи.
При розробці мови Borland Pascal 7.0 використана логічно завершенна, але найпростіша об'єктна модель. У цій моделі відсутні спеціальні засоби заховання реалізації класів і підтримки додаткових засобів і прийомів розробки класів (абстракцій метакласів, делегування і так далі).

Визначення класу

Клас в ООП - це структурний тип даних, який включає опис полів даних, процедур і функцій, що працюють з цими полями даних.

Визначення класу в Borland Pascal 7.0 здійснюється в два етапи. На першому етапі описується структура класу, де указуються: ім'я класу, поля даних і прототипи (заголовки) методів:

TYPE


<ім'я класу> = object

<ім'я поля даних 1> : <тип даних 1>;

..

<ім'я поля даних N> : < тип даних N>;

Procedure <ім'я методу 1>(<список параметрів>);

Function <ім'я методу 2>(<список параметрів>):<тип функції>;

Procedure <ім'я мет ода L>(<список параметрів>);

Function <ім'я методу М>(<список параметрів>):<тип функції>;

End;
Поля даних класу можуть бути наступних типів: числового; логічного; символьного; строкового адресного); типу діапазон; множина; масив; файл; клас; покажчик на клас; і ін.

Методами є процедури і функції мови Borland Pascal 7.0. При описів структури класу указуються тільки заголовки методів (ім'я процедури або функції, список передаваних параметрів, тип функції).

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

Procedure <ім'я класу>.<ім’я методу>



<опис локальних змінних, процедур і функцій>

Begin <оператори> End;

Function <ім'я класу>.<ім’яметоду>

<опис локальних змінних, процедур і функцій>

Begin <оператори> End;

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

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

Звернення до полів і методів класу здійснюється з вказівкою імені змінної (об'єкту), по аналогії із зверненням до полів запису з використанням:

- складених імен: <ім'я об'єкту>.<ім’я поля>

або

<ім'я об'єкту>.<ім’я методу>(<список фактичних параметрів>);

- оператора приєднання with:


with <ім'я об'єкта> do

begin


... <ім'я поля>...

... <ім'я методу> (<список фактичних параметрів>)...

end;
Для ініціалізації полів об'єктів можна використовувати три способи:

- ініціалізувати поля в основній програмі операторами привласнення вигляду:



<ім'я об'єкту>.<ім’я поля>:= <значення>

- розробити спеціальний метод ініціалізації, який отримує список параметрів і ініціалізувати ними поля (такий метод зазвичай називають Init);

- використовувати константи вигляду, що типізуються:

Const <ім'я об'єкту> : <ім'я класу> =

(<ім'я поля 1> : <значення поля 1>;

<ім'я поля 2> : <значення поля 2>;

<ім'я поля До>:<значение поля До>);

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


Спадкоємство
Спадкоємство – це таке співвідношення між класами, коли один клас використовує структурну або функціональну частину одного або декількох інших класів (відповідно просте і множинне спадкоємство).

У Borland Pascal 7.0 реалізовано просте спадкоємство, при якому у класу може бути тільки один батько, але скільки завгодно нащадків.

Будь-який клас можна оголосити нащадком раніше описаного класу. Нащадок успадковує всі дані і методи класу батька і доповнює їх своїми даними і методами.

В результаті використання механізму спадкоємство відпадає необхідність наново описувати поля, що вже існують в класі-батьку, і методи. Потрібно описати тільки ті поля і методи, які бракує в класі-батьку.

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

1. Насамперед компілятор встановлює тип об'єкту.

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

3. Якщо метод в класі об'єкту не знайдений, то йде пошук в класі-батьку. У разі успіху викликається метод батька.

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

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

Турe <ім'я класу-спадкоємця>=Object (<ім'я класу-батька>) <нові поля класу-спадкоємця> <нові методи класу-спадкоємця

End;

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


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

Формат запису операції привласнення виглядає таким чином:



<об'єкт класу-батька> := <об'єкт класу-нащадка>

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


Поліморфізм

Borland Pascal реалізує механізми простого і складного поліморфізму.



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

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



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

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

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

Поліморфні методи, для яких застосовується пізнє скріплення, називають віртуальними.

Для опису віртуальних методів використовується службове слово virtual:
Procedure <ім'я методу 1>(<список параметрів>); virtual;

Function <ім'я методу> (<список параметрів>):<тип функції>; virtual;


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

1. Якщо в деякому класі метод описаний як віртуальний, то всі похідні класи, що включають метод з тим же ім'ям, повинні описати цей метод як віртуальний. Не можна замінити віртуальний метод статичним.

2. Порядок розташування, кількість і типи формальних параметрів в однойменних віртуальних методах повинні залишатися незмінними.

3. Клас, що містить віртуальні методи, повинен включати спеціальний статичний метод - конструктор. Для цього методу слово Procedure в оголошенні і реалізації повинне бути замінене словом Constructor. Конструктор неявно виконує настройку механізму пізнього скріплення. Цей метод повинен бути викликаний до першого звернення до віртуального методу, інакше відбувається «зависання» комп'ютера. Як правило, конструктор використовують для ініціалізації полів об'єкту і, відповідно, називають Init.

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

Фактично використання віртуальних методів обов'язкове в трьох випадках:

1) поліморфний метод викликається із статичного методу батьківського класу;

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



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

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


База даних захищена авторським правом ©lecture.in.ua 2016
звернутися до адміністрації

    Головна сторінка