- •12.1. Класи й об’єкти. Основні поняття
- •12.2.Опис класів і об’єктів
- •12.3. Складові класів
- •12.4. Поняття успадкування
- •12.4. Поліморфізм. Віртуальні та динамічні методи
- •12.5. Структура опису класу
- •13. Класи загального призначення
- •13.1. Клас exception –- обробки виключень
- •13.2. Клас tlist – списки
- •13.3. Класи tstrings, tstringlist – набори рядків й об’єктів
12.2.Опис класів і об’єктів
Класи описуються у розділі Type глобального блоку. Опис класу розпочинається ключовим словом class і закінчується словом end. По формі клас подібний до запису, але тут крім полів даних містяться властивості та заголовки процедур і функцій, які використовуються для обробки цих даних. Такі процедури і функції називаються методами. Наприклад,
Type //Вимірювач дискового простору
TDiskGauge=class
DriveLetter:char; {Буква дисководу}
{Критичний процент вільного простору}
PercentCritical:integer;
{Повертає об’єм вільного простору на диску}
Function GetPercentFree:integer;
{Перевіряє стан ресурсу і видає звукове
повідомлення}
Procedure CheckStatus;
end;
Програмний код методів поміщається за межами класу. Клас описує сутність, яка моделюється у програмі. Так клас TDiskGauge описує вимірювач дискового простору. Цей клас містить два поля це буква дисководу і поріг дискового простору, якщо об’єм диску опускається до критичного значення, то користувачу видається звукове повідомлення. Визначені у класі методи будуть працювати з будь-яким об’єктом класу TDiskGauge.
Щоб перейти від опису класу до об’єкту слід його описати у розділі Var
Var DiskGauge: TDiskGauge;
Об’єкт у Object Pascal є динамічним, тому змінна DiskGauge є вказівником на конкретний екземпляр об’єкту, який ще фізично не існує. Для того щоб створити об’єкт у пам’яті і зв’язати з ним змінну DiskGauge у програмі слід виконати оператор
DiskGauge=TDiskGauge.Create;
Create - конструктор об’єкту, він завжди присутній у класі і служить для створення та ініціалізації об’єкту. При цьому виділяється пам’ять для полів, а методи як і звичайні процедури та функції поміщаються в область коду програми, вони працюють з усіма об’єктами свого класу і у пам’яті не дублюються. Після створення об’єкт можна використовувати у програмі - читати і встановлювати поля, викликати методи. Доступ до полів і методів здійснюється за допомогою складених імен
DiskGauge.DriveLetter:=’c’;
DiskGauge.PercentCritical:=10;
DiskGauge.CheckStatus;
або використовувати оператор приєднання with
with DiskGauge do
begin
DriveLetter:=’c’;
PercentCritical:=10;
CheckStatus;
end;
Якщо об’єкт стає не потрібним у програм, то його можна вилучити викликом спеціального методу
DiskGauge.Destroy;
Destroy – деструктор об’єкту, він присутній у класі разом із конструктором і служить для вилучення об’єкту із динамічної пам’яті. Після виклику деструктора змінна DiskGauge стає незв’язаною і не може використовуватися для доступу до полів і методів уже неіснуючого об’єкту. Для того щоб відрізняти зв’язані і незв’язані змінні, незв’язані змінні ініціалізуються значеням NIL.
Виклик деструктора для неіснуючого об’єкта недопустимий і приводить до помилки. Тому у об’єкти введено метод який аналізує стан об’єкту і викликає при необхідності деструктор Destroy
DiskGauge.Free;
Значення однієї об’єктної змінної можна присвоювати іншій, при цьому об’єкт не копіюється, а вказує на той же об’єкт. Наприклад,
var D1,D2: TDiskGauge;
begin
{Створюється об’єкт і змінна D1 зв’язана з ним}
D1: TDiskGauge.Create;
D2:=D1; {Змінні D1 і D2 зв’язані з одним об’єктом}
. . . . . . . .
{Об’єкт вилучено і змінні D1, D2 не зв’язані з ним}
D2.Free;
end;
Об’єкти можуть виступати у програмі не тільки в якості змінних, але й елементів масивів, полів записів, параметрів процедур і функцій.
У деяких випадках необхідно щоб об’єкти різних класів посилалися один на одного. Тоді ця проблема вирішується за допомогою попереднього опису. Наприклад,
Type
TaClass=class; {Попередній опис класу}
TbClass=class
W:TaClass
. . . . .
end;
TaClass=class
G:array[1..5] of TbClass;
. . . . .
end;
Попередній опис класу TaClass необхідний для того, щоб компілятор сприйняв опис W у класі TbClass.
