Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0389581_E8B54_antonova_a_r_ob_ektno_orientovane...doc
Скачиваний:
5
Добавлен:
01.04.2025
Размер:
885 Кб
Скачать
☆

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.