Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_KAZYMYR.doc
Скачиваний:
13
Добавлен:
09.11.2019
Размер:
3.71 Mб
Скачать

2.9.3.Конструктори й деструктори в Delphi

Object Pascal не підтримує автоматичного створення об'єктів, як це присутнє в С++. Об'єкти в Delphi можна створювати й знищувати тільки в динамічній пам'яті. При цьому використовується функції new і dispose. Однак для полегшення створення й знищення об'єктів існують спеціально розроблені методи класу TObject, які називаються Create і Free. Оскільки в Object Pascal всі класи є підкласами TObject, те вони успадковують методи даного класу.

Для окремих класів можуть бути визначені власні конструктори, які зобов'язані викликати конструктор класу TObject:

type

TPoint = class

сonstructor Create;

destructor Destroy; override;

…………

end;

constructor TPoint......reate;

begin

inherited Create;

…………

end;

Особливості визначення конструкторів:

  1. Перед оголошенню конструктора ставиться слово constructor.

  2. Успадкування методу класу Tobject забезпечується використанням специфікатора inherited.

  3. При створенні об'єкта всі поля ініціалізуються нулями.

Виклик конструктора в Delphi є обов'язковим і повинен передувати виклику об'єкта. Конструктор повертає посилання на об'єкт, яке привласнюється змінної типу даного об'єкта:

Point1:=Point.Create;

Існують відмінності у використанні конструктора класу Form який включається до складу проекту. Файл проекту зберігається з розширенням <>.dpr який можна переглянути в Delphi, використовуючи пункт меню Project/View Source. У даному файлі визначається перелік форм, які створюються при запуску додатка. Явно викликаючи конструктор, можна створити форму (заставку), що буде з'являтися на екрані під час створення всіх інших форм додатка:

begin

SplashForm := TSplashForm.Create(Application);

SplashForm.Show;

……………………

Application......reateForm(TMainForm, MainForm);

……………………

SplashForm......ree;

Application.Run;

end.

Після створення форми потрібно викликати метод Show для даної форми. Після появи форми й створення всіх інших форм необхідно викликати метод Free.

Примітка: подібним чином можна явно динамічно створювати форми в будь-якому місці. Але потрібно не забувати знищувати форму, коли необхідність у ній відпадає.

Об'єкти, створені за допомогою методу Create, повинні бути знищені шляхом виклику методу Free, що є методом класу Tobject. Крім методу Free для знищення об'єктів, існує метод Destroy, що побічно викликається з Free. Однак Free безпечніше, тому що він спочатку перевіряє чи був об'єкт насправді створений і тільки потім викликає Destroy, що уже безпосередньо звільняє пам'ять і знищує об'єкт.

Деструктори можуть бути визначені явно з обов'язковим перекриттям методу класу TОbject. У цьому випадку реалізація деструктора повинна включати виклик унаслідуваного методу Destroy:

destructor TPoint.Destroy;

begin

…………

inherited Destroy;

end......

Примітка: після закриття програми автоматично викликаються деструктори для всіх створених в ній об'єктів і вся займана ними пам'ять звільняється.

2.9.4.Конструктори й деструктори в Java

Особливості визначення конструкторів:

  1. Аналогічно c С++ конструктори в Java мають теж ім'я, що й клас.

class A {int a,b,c;

void f() {...………};

A(int x, int y, int z){ a = x ; b = y; c = z; // конструктор

…………

}

  1. Конструктор не містить тип значення, що повертає.

  2. Конструктор може бути перевантажений. Тобто, можуть бути визначені трохи конструкторів для одного класу, які будуть відрізнятися типами або числом параметрів.

  3. Усередині одного конструктора можна викликати інший конструктор, використовуючи спеціальну змінну this:

A (int initArray[]){this (initArray[0], initArray[1], initArray[2]);}

  1. Якщо конструктор не визначений, то створюється конструктор за замовчуванням (без параметрів).

  2. Всі об'єкти створюються динамічно використовуючи оператор new:

one = new A(); // виклик конструктора за замовчуванням

two = new A(1,2,3); // викликається конструктор із трьома параметрами

В Java, як і в SmallTalk, передбачена автоматична “зборка сміття”. Об'єкт знищується автоматично, коли він більше не використається. Однак не можна знати, коли точно буде викликаний ”збирач сміття”. Якщо необхідно виконати деякі дії перед знищенням об'єкта, як, наприклад, це було зроблено при визначенні деструкторів у С++ або в Object Pascal, то необхідно використати метод finalise(). Але й у цьому випадку час знищення об'єкта не задається.

Для примусових викликів ”збирача сміття” варто скористатися системним методом System.gc(), у результаті виконання якого будуть знищені всі об'єкти на які відсутні посилання.

Якщо автоматичну ”зборку сміття” потрібно скасувати, варто запустити додаток із прапором:

c:> java-noasynchgс <ім'я додатка >

Тоді для ”зборки сміття” потрібно використати системний метод runFinalization() який викликає метод finalize() для всіх об'єктів, на які немає посилань.