Об’єкти та об’єктно-орієнтоване програмування

4. Приклад програми з використанням об'єктів.

5. Поняття динамічних об'єктах.

6. Розширене використання процедури new.

7. Звільнення хіп-пам'яті від динамічних об'єктів.

1.Принципи об'єктно-орієнтованого програмування.

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

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

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

Об'єктно-орієнтоване програмування не заперечує процедурний підхід, лише піднімає його більш високий рівень. Інкапсуляція - це декомпозиція процедур за функціональним принципом, що вносить істотну впорядкованість у використання процедур. Виграш від використання об'єктно-орієнтованого підходу, тим вищий, чим складніша програма. В даний час багато програм будуються на базі об'єктно-орієнтованого підходу, а для побудови інтерфейсу користувача об'єктно-орієнтований підхід є загальновизнаним (він використаний, зокрема, в системах Turbo Vision і DELPHI).

2. Концепція об'єкта в Турбо Паскалі.

У мові Турбо Паскаль (починаючи з версії 5.5) введено нове поняття об'єкта як подальший розвиток концепції типу. Як і типи, об'єкти мають бути описані у розділі описів програми. Форма опису об'єкта аналогічна опису типу Запис. Відмінність лише тому, що ключовим словом опису є object , а чи не record , і крім звичайних полів (елементів структури даних) у описі об'єкта використовуються процедурні поля - заголовки процедур і функцій, інкапсульованих у цьому типі об'єкта. Крім того, можливості опису полів структури даних розширені - можуть описуватися, крім змінних, також необхідні типи даних, константи. Змінні, що утворюють структуру даних, називаються полями об'єкта, а процедури і функції - методами об'єкта. При цьому тіла методів повинні бути описані поза описом об'єкта: зазвичай, у відповідних модулях.

Деякі поля та методи об'єкта можна оголосити прихованими від користувачів об'єкта за допомогою директиви private (приватний, прихований), що вказується після загальної частини опису об'єкта. Всі поля та методи, описані після private,доступні тільки всередині модуля, де описаний сам об'єкт.

Приклад опису об'єкта:

type point = object;

Для роботи з об'єктами крім опису об'єкта, як і при описі інших типів, необхідно оголосити змінні типу об'єкт, звані екземплярами об'єктів. Наприклад, для описаного вище об'єкта point можна оголосити екземпляри: var p1, p2: point;

Для звернення до полів та методів об'єкта використовуються складові імена (імена з точкою), аналогічно тому, як це прийнято для записів. Наприклад: p1.X:=1; p1.Y: = p1.X; p2.X:=p1.getX; p1.SetColor(green);

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

Аналогічно записам, доступ до полів та методів об'єкта можна спростити за рахунок використання оператора with .

Наприклад: with p1 do begin x1:=getX; y1:=getY end;

Для об'єктів одного типу припустиме привласнення, наприклад: p1: = p2;

3. Властивості наслідування та поліморфізму об'єктів.

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

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

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

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

У Турбо Паскалі, щоб оголосити об'єкт нащадком деякого предка, необхідно після ключового слова object в круглих дужках вказати ім'я предка. При цьому в описі об'єкта-нащадка вказуються тільки додаткові поля і методи, відсутні у предка (або предків). Наприклад:

type Line = object (point);

procedure get_line(var x1,y1,x2,y2:integer);

Для екземплярів об'єктів Line доступні всі поля та методи об'єкта point і, крім того, поля координат другої точки (Хе і Ye), а також методи set_line та get_line.

Оператор присвоювання може бути використаний обмінюватись інформацією між родинними об'єктами. Проте допустимо лише односторонній обмін - від нащадка до предка. Наприклад, якщо оголосити L1 як екземпляр об'єкта Line, тодопустимо надання виду p1: = L1; але не навпаки.

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

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

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

4. Приклад програми з використанням об'єктів.

Програма з використанням об'єктів на Турбо Паскалі побудована як демонстрація роботи коду з виправленням помилки в одному символі повідомлення (коду Хеммінга). У цій програмі використані два модулі: модуль fbyte (аналогічний розглянутому раніше модулю f_byte) і модуль cod_Hem, що містить об'єкти: символ і рядок символів (Tsymb і Tstr_symb). Програма має такий вигляд:

uses CRT, Cod_Hem, Fbyte;

varmsg: string [22];

BEGIN TextColor (Yellow); TextBackground (white); ClrScr; writeln ('Початковий рядок:');