- •Передмова
- •Розділ 1 об'єктний підхід у програмуванні
- •1.1.Причини виникнення ооп
- •1.1.1.Складність об'єкта дослідження
- •1.1.2.Складність процесу розробки програмного забезпечення
- •1.1.3.Складність опису окремих елементів
- •1.2.Парадигма ооп
- •1.3.Історія розвитку ооп
- •Розділ 2 об'єкти й класи: інкапсуляція
- •2.1.Структура об'єкта й класу
- •2.2.Особливості опису класів у мовах ооп
- •2.2.1.Опис класів в SmallTalk
- •2.2.3.Опис класів в Delphi
- •2.2.4.Опис класів в Java
- •2.3.Поля даних та їх ініціалізація
- •2.3.1.Визначення полів даних в SmallTalk
- •2.3.3.Визначення полів даних в Delphi
- •2.3.4.Визначення змінних в Java
- •2.4.Доступ до даних
- •2.4.1.Доступ до даних в SmallTalk
- •2.4.3.Доступ до даних в Delphi
- •2.4.4.Доступ до даних в Java
- •2.5.Спеціальні змінні
- •2.5.1.Спеціальні змінні в SmallTalk
- •2.5.3.Спеціальні змінні в Java
- •2.5.4.Спеціальні змінні в Delphi
- •2.6.Посилання
- •2.6.1.Визначення посилань в SmallTalk, Delphi і Java
- •2.7.Методи
- •2.7.1.Загальна схема визначення методу
- •2.7.2.Визначення методів в SmallTalk
- •2.7.4.Визначення методів в Delphi
- •2.7.5.Визначення методів в Java
- •2.8."Дружні" методи
- •2.8.2.Аналог дружніх функцій в Delphi
- •2.9.Конструктори й деструктори
- •2.9.1.Конструктори й деструктори в SmallTalk
- •2.9.3.Конструктори й деструктори в Delphi
- •2.9.4.Конструктори й деструктори в Java
- •2.10.Властивості
- •2.10.1.Властивості в Delphi
- •2.10.2.Властивості в Java
- •2.12.Абстрактні методи
- •Розділ 3 успадкування
- •3.1.Форми успадкування
- •3.2.Успадкування в SmallTalk
- •3.3.1.Віртуальне успадкування
- •3.3.2.Правило сумісності типів
- •3.3.3.Використання конструкторів і деструкторів при успадкуванні
- •3.4.Успадкування в Delphi
- •3.4.1.Ієрархія класів в Delphi
- •3.4.2.Створення нових компонентів
- •3.5.Успадкування в Java
- •3.5.1.Використання ключового слова super
- •3.5.2.Клас Object
- •Розділ 4 поліморфізм
- •4.1.Віртуальні методи
- •4.2.1.Механізм пізнього зв'язування
- •4.2.2.Таблиця віртуальних методів
- •4.3.Поліморфізм в Delphi
- •4.3.1.Заміщення віртуальних і динамічних методів
- •4.3.2.Приведення типів
- •4.4.Поліморфізм в Java
- •4.5.Поліморфізм в SmallTalk
- •5.1.Потокові класи
- •5.1.1.Ієрархія потокових класів
- •5.1.2.Форматоване введення/ виведення
- •5.1.3.Маніпулятори
- •5.1.4.Введення/виведення у файл
- •5.2.Контейнерні класи
- •5.2.1.Ітератори
- •5.2.2.Визначення контейнерних класів
- •5.2.3.Стандартні контейнерні класи
- •5.3.1.Параметиізовані класи (шаблони)
- •5.3.2.Ітератори stl
- •5.3.3.Узагальнені алгоритми
- •Література
- •Додатки лабораторна робота №1 об'єкти й повідомлення в smalltalk
- •Лабораторна робота №2 класи й методи в smalltalk
- •Листинг 3.1
- •Листинг 3.2
- •Листинг 3.3
- •Лабораторна робота 5 компоненти в delphi
- •Лабораторна робота 6 меню й вікна в delphi
- •Лабораторна робота 7 розробка меню в java
- •Лабораторна робота 8 робота з подіями в java
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;
Особливості визначення конструкторів:
Перед оголошенню конструктора ставиться слово constructor.
Успадкування методу класу Tobject забезпечується використанням специфікатора inherited.
При створенні об'єкта всі поля ініціалізуються нулями.
Виклик конструктора в 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
Особливості визначення конструкторів:
Аналогічно c С++ конструктори в Java мають теж ім'я, що й клас.
class A {int a,b,c;
void f() {...………};
A(int x, int y, int z){ a = x ; b = y; c = z; // конструктор
…………
}
Конструктор не містить тип значення, що повертає.
Конструктор може бути перевантажений. Тобто, можуть бути визначені трохи конструкторів для одного класу, які будуть відрізнятися типами або числом параметрів.
Усередині одного конструктора можна викликати інший конструктор, використовуючи спеціальну змінну this:
A (int initArray[]){this (initArray[0], initArray[1], initArray[2]);}
Якщо конструктор не визначений, то створюється конструктор за замовчуванням (без параметрів).
Всі об'єкти створюються динамічно використовуючи оператор new:
one = new A(); // виклик конструктора за замовчуванням
two = new A(1,2,3); // викликається конструктор із трьома параметрами
В Java, як і в SmallTalk, передбачена автоматична “зборка сміття”. Об'єкт знищується автоматично, коли він більше не використається. Однак не можна знати, коли точно буде викликаний ”збирач сміття”. Якщо необхідно виконати деякі дії перед знищенням об'єкта, як, наприклад, це було зроблено при визначенні деструкторів у С++ або в Object Pascal, то необхідно використати метод finalise(). Але й у цьому випадку час знищення об'єкта не задається.
Для примусових викликів ”збирача сміття” варто скористатися системним методом System.gc(), у результаті виконання якого будуть знищені всі об'єкти на які відсутні посилання.
Якщо автоматичну ”зборку сміття” потрібно скасувати, варто запустити додаток із прапором:
c:> java-noasynchgс <ім'я додатка >
Тоді для ”зборки сміття” потрібно використати системний метод runFinalization() який викликає метод finalize() для всіх об'єктів, на які немає посилань.