- •1. Методичні вказівки до лабораторної роботи №1
- •1.1. Етапи створення віконної прикладної програми
- •1.2. Структура проекту Delphi
- •1.3. Приклад створення простої віконної прикладної програми
- •1.4. Теоретичні запитання
- •1.5. Завдання до лабораторної роботи №1.
- •2. Методичні вказівки до лабораторної роботи №2
- •2.1. Етапи створення віконної прикладної програми табулювання функції
- •2.2. Приклад створення віконної прикладної програми табулювання функції
- •2.3. Теоретичні запитання
- •Етапи створення віконної прикладної програми табулювання функції.
- •2.4. Завдання до лабораторної роботи №2.
- •3. Методичні вказівки до лабораторної роботи №3
- •3.1. Етапи створення віконної прикладної програми роботи з таблицями рядків StringGrid
- •3.2. Теоретичні запитання
- •3.3. Завдання до лабораторної роботи №3. Робота зі структурами даних типу масив
- •4. Методичні вказівки до лабораторної роботи №4
- •4.1. Основні поняття об'єктно-орієнтованого програмування. Робота з класами
- •4.2. Приклад. Об'єктно-орієнтована реалізація комплексних чисел
- •4.3. Завдання до лабораторної роботи №4. Створення об’єктного типу - клас.
- •4.4. Завдання до лабораторної роботи №5. Класи. Прості властивості та властивості-масиви
- •4.5. Завдання до лабораторної роботи №6. Класи. Спадкування. Поліморфізм
- •4.6. Теоретичні запитання
4. Методичні вказівки до лабораторної роботи №4
4.1. Основні поняття об'єктно-орієнтованого програмування. Робота з класами
Об'єктно-орієнтоване програмування (ООП) – це цілком природний підхід до побудови складних (і не дуже складних) програм і систем. ООП – це методика розробки програм, в основі якої лежить поняття об'єкт. Об'єкт – це деяка структура, що відповідає об'єктові реального світу, його поведінці. Задача, розв'язувана з використанням методики ООП, описується в термінах об'єктів і операцій над ними, а програма при такому підході являє собою набір об'єктів і зв'язків між ними.
Класична мова Паскаль дозволяє програмістові визначати власні типи даних – записи (records). Мова Object Pascal, підтримуючи концепцію ООП, дає можливість визначати класи. Клас – це складна структура, що включає, крім даних, що описані, опис процедур і функцій, що можуть бути виконані над представником класу – об'єктом.
Синтаксис оголошення класу наступний:
Type
<ім'я_класу> = class(<ім'я_класу-батька>)
public //доступно всім
<поля, методи, властивості, події>
published // видні в Інспекторі Об'єктів і змінювані
<поля, властивості>
protected // доступ тільки нащадкам
<поля, методи, властивості, події>
private // доступ тільки в цьому модулі
<поля, методи, властивості, події>
end;
Мова програмування Object Pascal, що використовується в Delphi, передбачає інструментарій створення класів. Для реалізації інтерфейсу Delphi вже використовує бібліотеку класів, що містить велику кількість різноманітних класів, що підтримують форму і різні компоненти форми (командні кнопки, полючи редагування і т.д.). Утім, це не заважає програмістові створювати свої нові класи.
Ключові положення концепції об'єктно-орієнтованого програмування:
Щоразу, коли структура даних повинна бути динамічної і містити вкладені структури, варто застосовувати засоби об'єктно-орієнтованого програмування.
Об'єктно-орієнтоване програмування засноване на трьох головних принципах – інкапсуляції, спадкуванні і поліморфізмі. Інкапсуляція – це об'єднання даних і поведінки (тобто методів) в одному пакеті (тобто об'єкті). Спадкування означає автоматичне включення всіх полів, властивостей і методів батьківського класу до складу дочірнього класу. Поліморфізм означає можливість перевизначення методу в дочірньому класі.
Об'єктна змінна є покажчиком на область пам'яті, у якій зберігаються дані об'єкта. Однак на відміну від звичайних покажчиків, об'єктну змінну для доступу до об'єкта не потрібно розадресовивати.
У системі Delphi поле – це змінна, вхідна до складу об'єкта, а властивість – це інтерфейс між даними, що зберігаються в полі, і іншою частиною програми. Методом називається підпрограма, асоційована з класом.
Клас є типом об'єкта.
Клас TObject є базовим класом Delphi. Усі класи (у тому числі компоненти й елементи керування) є нащадками класу TObject. Якщо батьківський клас не заданий, то за замовчуванням батьківським є клас TObject.
Синтаксис оголошення простої властивості має вигляд
property <ім'я_властивості> : <тип> [read <get-метод>]
[write <set-метод>];
У кожне оголошення властивості повинен входити, як мінімум, один специфікатор читання або запису.
Метод get читає значення поля, а метод set змінює його. Визначення методів get і set має наступний синтаксис:
function <ім'я_класу>. <get_ метод> : <тип>;
//Зверніть увагу: тип повинен збігатися з типом поля
begin
<get_ метод> := <ім'я_поля>;
end;
procedure <ім'я_класу> . <set_метод> (<значення> : <тип>);
//Зверніть увагу: тип значення повинен збігатися з типом поля
begin
<ім'я_поля> := <значення>;
end;
Метод get викликається щораз, коли у вихідному коді вираз
<об'єктна_змінна> . <ім'я_властивості>
стрічається в правій частині оператора присвоювання або в будь-якому операторі, що не є оператором присвоювання. Метод set викликається при кожному стрічанні у вихідному коді виразу
<об'єктна_змінна> . <ім'я_властивості>
в лівій частині присвоювання.
Синтаксис оголошення властивості-масиву має вигляд
property <ім'я_властивості>
<список_індексних_параметрів> :
<тип> [read <get-метод>] [write <set-метод>];
Список індексних параметрів міститься в квадратні дужки.
Для створення і видалення об'єктів використовуються спеціальні методи, називані конструктором і деструктором. Їхній синтаксис відрізняється від синтаксису звичайних методів тільки тим, що вони позначені ключовими словами constructor і destructor.
constructor <ім'я_класу> . Create;
begin
inherited Create;
[оператори_ініціалізації]
end;
destructor <ім'я_класу> . Destroy;
begin
[оператори_завершення]
inherited Destroy;
end;
При створенні об'єкта всі його поля автоматично ініціалізуються. Значення числових полів встановлюються в нуль, строковим полям присвоюється рядок null, а об'єктним полям – nil. У конструкторі програміст може ініціалізувати поля об'єкта по-іншому.
Ключове слово self позначає змінну, присутню в кожнім методі за замовчуванням і посилається на об'єкт, якому належить цей метод. Змінна self корисна для передачі інформації про поточний об'єкт в іншу підпрограму або для виклику іншого методу класу.
Об'єкти є динамічними структурами. Для оголошення нової об'єктної змінної використовується синтаксис
var <об'єктна_змінна> : <ім'я_класу>;
Перш ніж об'єктна змінна може бути використана, необхідно створити об'єкт:
<об'єктна_змінна> := <ім'я_класу> . Create;
Для видалення об'єкта використовується оператор
<об'єктна_змінна> . Free;
Для цього рекомендується використовувати метод Free, а не Destroy, тому що метод Destroy генерує для об'єктів nil помилку.
Загублений об'єкт не має об'єктної змінної, яка на нього посилається. Поява загублених об'єктів може привести до витоку пам'яті. Пам'ятаєте: об'єкти є динамічними структурами. Оскільки об'єкти створюються програмістом, він же повинен і видалити їх з пам'яті, щоб звільнити займаний ними простір для інших цілей.
За допомогою ключового слова inherited можна викликати метод батьківського класу. Це ключове слово відіграє важливу роль у реалізації принципу поліморфізму.
Директива overload використовується для перевантаження методів. Виклик з методу дочірнього класу перевантаженого методу тягне активізацію тієї версії методу, список формальних параметрів якої збігається зі списком фактичних параметрів.
Необов'язкова директива reintroduce стримує попередження компілятора про те, що методи з цим же ім'ям вже оголошені в батьківських класах.
Абстрактний метод – це метод, що має лише декларацію (оголошення) і не має коду його реалізації.
Абстрактні методи в Object Pascal оголошуються з директивою abstract.
Директива abstract застосовується тільки разом з директивою virtual або dynamic.
Абстрактні методи перевизначаються в нащадках класу з використанням директиви override.
