Uploaded by Ольга Залевская

ООП

advertisement
В основі мові програмування лежить деяка керуюча ідея, що впливає на
стиль відповідної програми. Першою була ідея процедурного структурування
програм, в відповідності до якої програміст мав вирішити, які саме методи
буде використовувати в програмі, а потім підібрати відповідні алгоритми їх
реалізації. Пізніше дана їдея була удосконалена. На основі її з’явилось
декілька підходів до програмування.
Один з підходів -"Об'єктно-орієнтоване програмування" або,
скорочено, ООП. Ідея цього підходу полягає в прагненні пов'язати дані з
процедурами, що відповідають за їх реалізацію в одне ціле - ОБ'ЄКТ.
Об'єктом ми будемо називати тип даних, аналогічний запису (record), з яким
пов'язаний певний набір процедур і функцій (що називаються методами). Для
кожного об'єкта ми можемо створювати будь-яку кількість екземплярів
об'єкта.
Отже, в кожному екземплярі об'єкта є певний набір змінних (вони
можуть мати різні типи), а всім екземплярам об'єкта відповідає набір методів,
з допомогою яких відбувається робота з об'єктом. Добре реалізований об'єкт
буде представляти собою "чорний ящик", робота з ним буде здійснюватися
тільки за допомогою методів.
Базовими блоками об'єктно-орієнтованої програми є об'єкти і класи.
Змістовно об'єкт можна представити як щось відчутне або уявне та має певну
поведінку. Таким чином, об'єкт можна побачити чи помацати, або,
принаймні, знати, що він є, наприклад, представлений у вигляді інформації,
що зберігається в пам'яті комп'ютера.
Об'єкт - це частина навколишньої реальності, тобто він існує в часі і в
просторі (вперше поняття об'єкта у програмуванні введено в мові Simula ).
Формально об'єкт визначити досить важко. Це можна зробити через деякі
властивості, а саме: об'єкт має стан, поведінку і може бути однозначно
ідентифікований (іншими словами, має унікальне ім'я).
Клас - це безліч об'єктів, що мають загальну структуру та загальну
поведінку. Клас - опис (абстракція), що показує, як побудувати існуючу в
часі і просторі змінну цього класу, звану об'єктом. Зміст пропозицій «опис
змінних класу» і «опис об'єктів класу» один і той же.
Об'єкт має стан, поведінку і паспорт (засіб для його однозначної
ідентифікації); структура та поведінка об'єктів описані в класах, змінними
яких вони є .
Визначимо тепер поняття стану, поведінки та ідентифікації об'єкта.
Стан об'єкта об'єднує всі його поля даних (статичний компонент, тобто
незмінний) і поточні значення кожного з цих полів (динамічний компонент,
тобто зазвичай змінюється).
Поведінка виражає динаміку зміни станів об'єкта і його реакцію на
поступають повідомлення, тобто як об'єкт змінює свої стани і взаємодіє з
іншими об'єктами.
Ідентифікація (розпізнавання) об'єкта - це властивість, яка дозволяє
відрізнити об'єкт від інших об'єктів того ж чи інших класів. Здійснюється
ідентифікація за допомогою унікального імені (паспорта), яким наділяється
об'єкт в програмі, втім як і будь-яка інша змінна.
У Турбо Паскаля ООП реалізовано починаючи з версії 5.5.
ООП базується на трьох важливих принципах, що додають об'єктів особливі
властивості і відрізняють їх від інших типів даних. Розглянемо їх:
ІНКАПСУЛЯЦІЯ.
Об'єднання в єдине ціле даних та алгоритмів обробки ЦИХ даних. В
результаті інкапсуляції з’являється новий тип даних - об'єкт.
СПАДКУВАННЯ.
Можливість використання вже певних об'єктів для побудови ієрархії об'єктівнащадків. Об'єкт-нащадок успадковує від батька ВСІ поля і методи, і може
доповнювати об'єкти новими полями або замінювати їх.
ПОЛІМОРФІЗМ.
Можливість визначення єдиної за імені дії (процедури або функції), що
застосовуеться одночасно до всіх об'єктів ієрархії спадкування, причому
кожен об'єкт може "замовляти" особливість реалізації цієї дії над самим
собою".
ОБ’ЯВЛЕННЯ ОБ’ЄКТІВ
Спочатку може здатися, що при описі немає різниці між об'єктами і
записами. Насправді різниця полягає в тому, що при описі об'єкта в нього
можуть входити заголовки процедур і функцій, адже за визначенням об'єкт
це "Дані+Алгоритми" або "Алгоритми+Структури Даних=Об'єкти".
Оскільки, об’єкти є новим типом даних, то об’являються вони в розділі
TUPE. Наприклад
type
T = object
{ Змінні або полі Об’єктів
}
...
{ Заголовки процедур та функцій, або МЕТОДИ
}
end;
Змінні, описані в об'єкті називаються полями, а процедури їх обробки
методами.
У самому типі об'єкта описано лише інтерфейс методу, тобто спосіб його
виклику. Сам метод описується в розділі процедур і функцій, і заголовок має
нестандартну форму (перед його ім'ям обов'язково вказується ім'я типу
об'єкта, до якого цей метод належить):
procedure ObjectType.ProcedureName(...);
Тобто <ім’я об’єкта >.<ім’я процедури >
Параметри описуються як завжди, за винятком того, що всередині методу
завжди доступні поля об'єкта безпосередньо за їх іменами. Наприклад:
type
TA = object
a: Integer;
procedure give(x:integer);
end;
{ ... }
procedure TA.give(x: integer);
begin
a := a + x;
end;
Так як завдання заголовка методу в описі типу об'єкта є випереджальним
описом, то так само, як при реалізації процедур і функцій в розділі
IMPLEMENTATION, список параметрів може опускатися, тобто, такий опис
буде повністю аналогічний попередньому:
procedure TA.give;
begin
a := a + x;
end;
Змінні типу "об'єкт" можна створювати як за звичайно , оголошенням у
списку змінних (при такому способі для використання примірників об'єктів змінних об'єктного типу - у програмі, їх викликають так:
<имя_объекта>.<имя_метода>):
type TA = object ... end;
var a: TA;
begin
a.give(5);
end.
Найбільш зручніше розміщувати об’єкти в динамічній пам’яті комп’ютера.
Для цього необхідно створити додатковий тип – вказівник.
type
PTA = ^TA;
TA = object ... end;
var p_a: PTA;
begin
new(p_a);
p_a^.give(5);
end.
Спадкування
При описі об'єкта-спадкоємця (також званого похідним типом), ім ’ я його
батька наводиться у дужках. Наприклад:
TA =
object
{ поля і методи об'єкта TA }
end;
TA1 =
object(TA) { нащадок TA }
{ ... }
end;
Поля і методи батьків можуть з'являтися в реалізації методів спадкоємця, так
наче б вони були описані явно в самому спадкоємці. Процес спадкування є
транзитивним: якщо TB успадковується від TA, а TC у свою чергу спадкоємець TB, то тип TC також вважається спадкоємцем TA.
Слід звернути увагу на те, що при спадкуванні полів у похідному типі не
можна оголошувати ідентифікатори, які вже використовувалися в одному їх
типів-батьків. (На методи це обмеження не поширюється, в разі повторного
визначення методу він вважається переприсвоєнним , і до всіх нащадків буде
переходити саме новий метод).
З "вміння" об'єктів "наслідувати" випливає правило присвоювання для
змінних типу "Об'єкт": змінним такого типу можна привласнювати не тільки
значення цього ж типу, але і значення будь-якого похідного типу. Наприклад,
при такому визначенні:
type
TA = object
x: integer;
{...}
end;
TB = object(TA)
y: integer;
{...}
end;
var a: TA; b: TB;
для копіювання значення X записаного в змінну b в змінну a досить виконати
присвоєння:
a := b;
Увага:
Операція присвоювання можлива тільки таким шляхом:
"Батько <-- Спадкоємець"
При цьому гарантується заповнення всіх полів типу "Батько" вмістом
відповідних полів типу "Спадкоємець", так як в "Спадкоємця" число полів не
менше, ніж у попередників. В іншому випадку могла б виникнути
невизначеність з "зайвими" полями, яких немає в "Основі".
Операцією присвоювання копіюються тільки поля. Методи таким чином не
присвоюються...
ПРИХОВУВАННЯ ІНФОРМАЦІЇ
Всередині опису полів можна використовувати слово private, яке буде
розділяти поля на два типи. До полів, описаних вище слова private можна
звертатися з будь-якого місця програми, а нижче - тільки з поточного модуля
(такі поля називають прихованими).
При описі об'єктів намагаються як можна більше полів зробити
прихованими. Це підкреслює самостійність об'єкта, робота з яким
відбувається тільки за допомогою не схованих полів і методів. Зауважу, що
навіть просте присвоювання полю значення часто роблять за допомогою
методу. Адже, в майбутньому у доповненні до цього присвоювання можуть
використовуватися інші операції.
Download