ДИНАМІЧНІ ОБ'ЄКТИ p>
Об'єктні змінні вo чому подібні звичайним змінним Турбо
Паскаля, зокрема, їх можна розміщувати в динамічній пам'яті. Турбо
Паскаль містить засоби, що полегшують розміщення об'єктних змінних вкупі і їх видалення з неї, наприклад: var p>
Pline: ^ Tline; p>
....... p>
New (Pline, Init): p>
....... p>
У цьому прикладі розміщення об'єктної змінної (на неї вказує
PLINE) в купі супроводжується одночасним зверненням до конструктора
TLINE.INIT для ініціалізації об'єкту і зв'язування віртуальних методів зновоствореної змінної: у процедурі NEW допускається як другапараметра вказувати звернення до конструктора. p>
Більш того, процедуру NEW можна викликати і як функцію - у цьому випадкувона повертає значення типу POINTER, яке вказує на динамічнорозподілений об'єкт: p>
PLine: = New (TLine);або p>
PLine: = New (TLine, Init): p>
Зверніть увагу: перше параметром процедурі New передаєтьсяпокажчик на динамічно розподілена об'єкт, у той час як першіпараметром функції NEW - тип розподілюваного об'єкта. І в тому, і в іншомувипадку в якості другого параметра звернення допускається використовувати викликконструктора, однак ім'я конструктора не може бути складовим-адже вмомент звернення динамічний об'єкт ще не створено. Наприклад, оператор p>
New (Pline, PLine ^. Init);викличе повідомлення про помилку. p>
При зверненні до NEW з одночасним викликом конструктора динамічнапам'ять резервуються за допомогою спеціального програмного коду, що входить добудь-конструктор і викликається до початку роботи виконується частиниконструктора (до begin). При цьому динамічна пам'ять може виявитисявичерпаною. У цьому випадку стандартна функція обробки помилокадміністратора купи видає значення 0, що викликає аварійне завершенняпрограми з кодом помилки 203. Якщо використовується нестандартна функціяобробки помилок і ця функція повертає 1, конструктор пропускаєоператори після begin і повертає NIL. Таким чином гарантується, щовиконувані оператори конструктора будуть працювати тільки за умовинормального розподілу динамічної пам'яті. Однак в тілі конструктораможе бути створено новий динамічний об'єкт, в ньому - свій і т.д. Турбо
Паскальдопускає довільну глибину вкладеності конструкторів. Якщо на якомусьрівні виявиться брак динамічної пам'яті, необхідно ліквідувативесь ланцюжок успішно розподілених об'єктів. Щоб ця операція сталаможливою, в Турбо Паскаль введена стандартна процедура без параметрів
FAIL, яка може викликатися тільки з конструктора і яка звільняєвже виділену конструктором пам'ять, завершує його роботу і повертає NIL. p>
Для видалення динамічного об'єкта з купи використовується особливий метод --деструктор, що описується за допомогою зарезервованого слова DESTRUCTOR. Уцей метод можна передбачити всі дії, пов'язані з ліквідацієюдинамічного об'єкту (тобто змінної об'єктного типу, розміщеної вдинамічної пам'яті), наприклад, здійснити потрібну корекцію спискудинамічних об'єктів. Звернення до деструктор вказується другупараметром при виклику процедури DISPOSE, наприклад: p>
.......... type p>
TLine = object (Point) p>
...... p>
Constructor Init; p>
Destructor Done; end;
....... p>
New (PLine, Init); (Розміщення динамічного об'єкта) p>
....... p>
Dispose (PLine, Done); (Видалення динамічного об'єкта) p>
....... p>
При необхідності деструктор, як і будь-який інший метод об'єкта
(окрім конструктора!), можна оголосити віртуальним. p>
p>