Доповідь - Динамічні об'єкти (ТурбоПаскаль)
Химия

Доповідь — Динамічні об’єкти (ТурбоПаскаль)


Завантажити доповідь: Динамічні об’єкти (ТурбоПаскаль)

Об’єктні змінні багато в чому подібні до звичайних змінних Турбо Паскаля, зокрема, їх можна розміщувати в динамічній пам’яті. Турбо Паскаль містить засоби, що полегшують розміщення об’єктних змінних у купі та їх видалення з неї, наприклад:

var

Pline: ^Tline;

New (Pline, Init):

У цьому прикладі розміщення об’єктної змінної (на неї вказує PLINE) у купі супроводжується одночасним зверненням до конструктора TLINE.INIT для ініціалізації об’єкта та зв’язування віртуальних методів із новоствореною змінною: у процедурі NEW допускається як другий параметр вказувати звернення до конструктора.

Більш того, процедуру NEW можна викликати і як функцію — у цьому випадку вона повертає значення типу POINTER, що вказує на динамічно розподілений об’єкт:

PLine: = New (TLine);

або

PLine := New(TLine, Init):

Зверніть увагу: першим параметром процедури New передається покажчик на об’єкт, що динамічно розподіляється, в той час як першим параметром функції NEW — тип розподіленого об’єкта. І в тому, і в іншому випадку як другий параметр звернення допускається використовувати виклик конструктора, проте ім’я конструктора не може бути складовим — адже в момент звернення динамічний об’єкт ще не створений. Наприклад, оператор

New(Pline, PLine^.Init);

Викликає повідомлення про помилку.

При зверненні до NEW з одночасним викликом конструктора динамічна пам’ять резервується за допомогою спеціального програмного коду, що входить у будь-який конструктор і викликається до початку роботи конструктора, що виконується (до begin). При цьому динамічна пам’ять може бути вичерпаною. У цьому випадку стандартна функція обробки помилок адміністратора купи видає значення 0, що викликає аварійне завершення програми з кодом помилки 203. Якщо використовується нестандартна функція обробки помилок і ця функція повертає 1 конструктор пропускає оператори після begin і повертає NIL. Таким чином гарантується, що оператори конструктора, що виконуються, працюватимуть лише за умови нормального розподілу динамічної пам’яті. Однак у тілі конструктора може бути створений новий динамічний об’єкт, у ньому – свій і т.д. Турбо Паскаль припускає довільну глибину вкладеності конструкторів. Якщо на якомусь рівні виявиться нестача динамічної пам’яті, необхідно ліквідувати весь ланцюжок успішно розподілених об’єктів. Щоб ця операція стала можливою, у Турбо Паскаль введено стандартну процедуру без параметрів FAIL, яка може викликатися тільки з конструктора і яка звільняє вже виділену конструктором пам’ять, завершує його роботу та повертає NIL.

Для видалення динамічного об’єкта з купи використовується особливий метод – деструктор, який описується за допомогою зарезервованого слова DESTRUCTOR. У цьому методі можна передбачити всі дії, пов’язані з ліквідацією динамічного об’єкта (тобто змінної об’єктного типу, розміщеної в динамічній пам’яті), наприклад, здійснити потрібну корекцію списку динамічних об’єктів. Звернення до деструктора вказується другим параметром під час виклику процедури DISPOSE, наприклад:

type

TLine = object(Point)

Constructor Init;

Destructor Done;

end;

New (PLine, Init);

{Розміщення динамічного об’єкта}

Dispose (PLine, Done);

{Видалення динамічного об’єкта}

При необхідності деструктор, як і будь-який інший метод об’єкту

(крім конструктора!), Можна оголосити віртуальним.

© Реферат плюс



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *