
Доповідь — Динамічні об’єкти (ТурбоПаскаль)
Завантажити доповідь: Динамічні об’єкти (ТурбоПаскаль) | |||
Об’єктні змінні багато в чому подібні до звичайних змінних Турбо Паскаля, зокрема, їх можна розміщувати в динамічній пам’яті. Турбо Паскаль містить засоби, що полегшують розміщення об’єктних змінних у купі та їх видалення з неї, наприклад:
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);
{Видалення динамічного об’єкта}
При необхідності деструктор, як і будь-який інший метод об’єкту
(крім конструктора!), Можна оголосити віртуальним.
© Реферат плюс

