Тема 2: [Об'єктно-орієнтований підхід до програмування в Object Pascal]
1. Поняття об'єкту в Delphi
2. Ініціалізація та знищення об'єктів
3. Інкапсуляція
4. Наслідування
5. Поліморфізм
1. Поняття об'єкту в Delphi
Об'єктно-орієнтоване програмування - це методологія програмування, побудована на представленні програми у вигляді сукупності об'єктів, кожен із яких є екземпляром певного класу, а класи утворюють ієрархію наслідування.
В основі об'єктно-орієнтованого програмування лежать три фундаментальні принципи: інкапсуляція, наслідування та поліморфізм.
Інкапсуляція - це об'єднання 3-х різних за природою сутностей: полів, методів та властивостей в один об'єкт. З іншої сторони, це процес розділення вмісту та поведінки об'єкта. Інкапсуляція служить для того, щоби ізолювати дані об'єкта від його поведінки.
Наслідування - це принцип, згідно якого клас-нащадок наслідує таку саму структуру даних та методів (поведінку), що і у його предка.
Поліморфізм - це принцип, коли одне і те ж імя може означати об'єкти різних типів, але, оскільки їх класи мають одинакового предка, то такі об'єкти мають спільну сукупність операцій, що можна над ними виконувати.
Клас — це складна структура, яка включає крім опису даних, опис процедур і функцій, які можуть бути виконані над представником класу об’єктом.
Розглянемо приклад простого класу:
TStudent = class
Private
fname : string [20];
fgrupe : string [8];
Public
procedure Show;
end;
Дані класу називаються полями, процедури і функції — методами. В наведеному прикладі TStudent — ім’я класу, fname, fgrupe — імена полів, Show — ім’я методу. В Delphi прийнято, що імена класів починаються з букви T, імена полів — з букви f. Опис класу знаходиться в розділі опису типів.
Об’єкти як представники класу описуються в розділі var. Наприклад,
Var
X, Y: TStudent;
2. Ініціалізація та знищення об'єктів
В Delphi об’єкт — це динамічна структура. Змінна-об’єкт містить не дані, а посилання на дані об’єкту. Тому потрібно завжди пам’ятати про виділення пам’яті для цих даних. Виділення пам’яті здійснюється за допомогою спеціального методу — конструктору, який за звичай називають Create (створити). Для того, щоб підкреслити важливу роль і поведінку конструктора, в описі класу замість слова procedure викорстовуєтья слово constructor.
Наприклад,
TStudent = class
Private
fname : string [20];
fgrupe : string [8];
Public
procedure Show;
constructor Create;
end;
Виділення пам’яті для даних об’єкту відбувається шляхом присвоювання значення результату застосування методу конструктора до типу (класу) об’єкта.
Наприклад, після виконання інструкції
X := TStudent.Create;
Виділяється необхідна пам’ять для даних об’єкту X.
Крім виділення пам’яті конструктор ще розв’язує задачу ініціалізації об’єкту, тобто присвоювання полям об’єкту початкових значень. Наведемо приклад реалізації конструктора для об’єкту TStudent:
Constructor TStudent.Create;
begin
fname := ‘ ‘;
fgrupe := ‘ ‘;
end;
Виділення пам’яті в конструкторі здійснює компілятор.
Після створення та ініціалізації об’єкт можна використовувати. Доступ до полів об’єкту здійснюється вказуванням імені об’єкту та імені поля, які відокремлюються один від одного крапкою. Наприклад,
X.fname := ‘Tanja’;
x.fgrupe := ‘MI-22’;
Для знищення об'єкту служить деструктор. Деструктор оголошується за допомогою зарезервованого слова destructor, після якого йде ім'я деструктора. Деструктор нічого не повертає і не має параметрів. Варто замість прямого виклику деструктора використовувати метод Free. Цей метод є у всіх класів в Delphi, оскільки вони наслідуються від Tobject. Цей метод спочатку перевіряє правильність вказівника на клас (не рівність nil), а потім тільки викликає Destroy. Це безпечніший спосіб знищення об'єкту.
Якщо в програмі якийсь об’єкт більше не використовується, то можна звільнити пам’ять, яку займають поля даного об’єкту. Для цього використовують метод-деструктор Free. Наприклад, для того, щоб звільнити пам’ять, яку займають поля об’єкту X достатньо записати:
