Type рядок=object
X,y,dl:integer;
Fon,colir:integer;
St:string;
Procedure int(in x,in y,dl,f,c:integer;r:string);
Procedure show;
Procedure hide;
Function get x
Function get y;
End.
Даний опис характеризує рядок текста не тільки полями даних (координати, колір, довжина), але і деякими правилами поведінки (як рядок відобразиться на екрані (show), як необхідно сховати (hide)).
Можна сказати, що поля даних об’єкту, це те що об’єкт знає, а його метод-це те що об’єкт робить. Поля даних повинні розміщуватись в об’єкті перед полями методів.
При описі типу вказується тільки заголовок підпрограми, а вся підпрограма розміщується окремо але після опису всіх об’єктів програми. Тип об’єкту треба описувати або в головній програмі, або в розділі Interface модуля.
По перше треба зробити так:
Скласти спеціальний модуль для об’єктів. Потім в розділі Interface розміщують заголовок метода, а в розділі Implementation – саму підпрограму. Така підпрограма виконує операції над полями свого об’єкту. В мові Turbo Pascal можна формально обробляти поля звичайним способом (без методів), але це не відповідає ідеології ООП.
Кількість полів, їх методів обробки в об’єкті залежить від підходу:
Можна взяти обмежену кількість тільки на сьогодні, а можна вмістити їх багато. Останній спосіб більш клопіткий. В цьому разі легше використати необов’язкове правило:
Доступ до полів даних об’єкту мають тільки методи цього об’єкту. Область дії полів даних розповсюджується на підпрограми-методи. Це означає, що імена формальних параметрів не повні співпадати з іменами полів даних. Наступна властивість нового типу даних – спадкоємність. Вона дозволяє при побудові нового об’єкту використовувати вже сконструйований об’єкт. Розглянемо цю властивість на прикладі об’єкту вікно. Якщо ми працюємо за ООП технологією, то визначити новий об’єкт вікно можна як нащадок об’єкта рядок, для якого достатньо в дужках після слова object записати ім’я батьківського типу, наприклад:
Type вікно = object (рядок)
Це значить, що новий тип вікно у спадщину отримує всі поля та методи свого батька рядок. Крім цього, в цей тип можна добавити необхідну кількість нових інформаційних полів (розмір вікна, назву вікна, кількість рядків в ньому).
В одній програмі один і той самий тип може бути батьківським для декількох нащадків, але кожний об’єкт – нащадок може мати тільки одного батька.
В програмі можна будувати ієрархію об’єктів будь-якої складності по схемі:
Дід, батько, син, внук, і т.д. З урахуванням того, що кожен об’єкт може мати декілька нащадків, можна будувати сімейне дерево.
Існують декілька особливостей у виборі назв полів з даними та назв методів. Назви інформаційних полів в різних рівнях ієрархії повинні бути неоднаковими, а назви методів можуть співпадати.
Наприклад: об’єкт, рядок, метод show для відображення рядка на екрані. Об’єкт вікно теж треба формувати на екрані, для цього можна визначити якийсь новий метод із своїм ім’ям. Але краще в типі вікно описати методом з такою ж назвою Show, тому що він виконує принципово ту ж роботу, що і в типі рядок, хоча можливо і іншими засобами. Говорять, що новий метод перекриває старий метод з таким же ім’ям. Щоб не плутати старі та нові методи їх записують як складні імена:
Рядок.show вікно.show
Новий метод при необхідності може мати інший склад формальних параметрів.
Дві властивості ООП – це інкапсуляція та спадкоємність – проявляються в першу чергу при описі типів. Всі операції в програмі виконуються над змінними. В термінології ООП змінну називають екземпляром об’єкта, а описується вона як звичайна змінна. Turbo Pascal дозволяє працювати з полями даних таких змінних звичайним засобом. Але ідеологія ООП рекомендує це робити за допомогою методів. Виклик метода на виконання записується як складне ім’я – спочатку ім’я екземпляру, а потім ім’я методу:
Stroke.show
Третя властивість ООП – поліморфізм.
Для нашого прикладу поліморфізм заключається в тому, що один і той самий метод може переміщувати або рядок, або вікно в залежності від того, як його викликали. Для зв’язування методів, їх викликають як віртуальні. В об’єкті з віртуальними методами повинен бути спеціальний метод з назвою Конструктор Constructor (його вживають замість слова Procedure). Цей метод виконує ініціалізацію об’єкта, і називається Constructor Init. Він викликається до першого звернення до віртуального методу. Крім звичних видимих операцій по визначеню полів даних цей метод виконує деяку роботу для підтримки спеціальної таблиці віртуальних методів. Така таблиця зберігає розміри типів об’єктів та адреси віртуальних методів, які використовуються при пізньому зв’язуванні. Якщо тип має віртуальний метод, то екземпляри цього типу мають зв’язок з таблицею віртуальних методів. Програми з такими методами потребують більшої пам’яті і виконуються довше. Але вони більш зручні в використанні та модифікації.
При роботі в ООП використовується спеціальний метод DESTRUCTOR. Цей метод описується серед інших методів:
DESTRUCTOR DONE;
(Збиральник сміття.)
Дескриптори призначені для видалення динамічно розміщених об’єктів та вивільнення пам’яті, яку вони займають. Як правило, дескриптор об’єднує всі дії по звільненню пам’яті, так щоб очистку можна було виконати за один виклик деструктора.
Для кожного об’єктного типу при необхідності, може бути створено декілька деструкторів, які виконують очистку пам’яті різними методами.
Деструктори можуть бути як статичними, так і віртуальними і їх дозволяється наслідувати. Так як для різних типів об’єктів часто користуються різними методами вивільнення пам’яті, то рекомендується завжди об’являти деструктори віртуальними, завдяки чому для кожного типу об’єкта буде вибраний правильний деструктор.