Student.Done;
Метод Done повинен інкапсулювати всі деталі очистки свого об’єкту, а також всіх структур даних і вкладених об’єктів. Для позначення таких методів звичайно рекомендується використовувати ідентифікатор Done.
Часто корисно і допустимо визначати кілька методів очищення для даного типу об’єкту. Залежно від їх розміщення чи використання, чи залежно від стану і режиму на момент очищення складні об’єкти можуть вимагати очищення різними способами.
Pascal надає розробникам спеціальний тип методу, який називається деструктором, для очищення і видалення динамічних об’єктів. Деструктор об’єднує етап видалення об’єкту з іншими діями чи задачами, необхідними для даного типу об’єкту. Для одного типу об’єкту можна визначити кілька деструкторів.
Type
TStudent=object
Name:String[30];
Date:string[10];
rate:real;
constructor init(nm,Dt:String;rt:real);
Destructor done; virtual;
function GetName:string; virtual;
function getdate:string;
function getrate:real;
Procedure showname;
Procedure showdate;
Procedure showrate;
End;
Деструктори можна успадковувати і вони можуть бути статичними чи віртуальними. Оскільки різні програми завершення об’єктів звичайно вимагають різних типів об’єктів, рекомендується завжди визначати деструктори віртуальними, щоб для кожного типу об’єктів виконувався правильний деструктор.
Нема необхідності вказувати зарезервоване слово DESTRUCTOR для кожного методу очистки, навіть якщо визначення типу об’єкту містить віртуальні методи. Насправді деструктори працюють лише з динамічними об’єктами. При очистці таких об’єктів деструктор виконує деякі спеціальні функції, гарантуючи, що в динамічній пам’яті буде вивільнятися правильне число байт. Але використання деструктора до статичних об’єктів теж не є помилкою і не призводить до некоректної роботи програми.
Основною перевагою використання деструктора є видалення з пам’яті поліморфних об’єктів, тобто тих, які були присвоєні екземпляру батьківського типу завдяки правилам сумісності. Будуючи код поліморфного об’єкта, компілятор під час компіляції точно не знає, який тип об’єкту насправді буде використаний. Єдине, що йому відомо – це ієрархія потомків предка певного типу, до якої цей об’єкт належить.
Очевидно, що розміри типів об’єктів відрізняються. Інформація про розмір об’єкта, який видаляється, стає доступною для деструктора в момент видалення завдяки вертанню до таблиці віртуальних методів екземплярів об’єктів певного типу VMT.
Для виконання звільнення пам’яті при пізньому зв’язуванні деструктор потрібно викликати як частину розширеного синтаксису процедури Dispose
Дата добавления: 2015-08-26; просмотров: 557;