- •Передмова
- •Розділ 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.2.3.Опис класів в Delphi
Визначення класу “Точка” в Object Pascal буде мати такий вигляд:
type TPoint=class
x: integer;
y: integer;
visible: boolean;
procedure SwOn;. . . . . . . . . . . . . . .
end;
procedure Tpoint.SwOn;
begin . . . . . . . . end;
Особливості визначення:
Імена класів завжди починаються з великої літери «T».
Оголошення даних завжди передують оголошенню методів.
Опис класів обов'язково розташовується усередині модуля, що має наступну структуру:
Unit OOP;
uses
interface
type TPoint=class
. . . . . . . end;
implementation
procedure Tpoint.SwOn; begin . . . . . end;
end.
Допускається, як і в мові C++, попереднє оголошення класу:
type TFirst=class;
TSecond=class;
end;
Не допускається визначення класів усередині процедур і інших блоків.
В Delphi існує аналог шаблонів класу в C++, що називається «класові посилання».
Розглянемо приклад. Нехай необхідно розробити програму, що повинна ініціалізувати і створювати об'єкт потрібного класу у вікні “FormClassRef” (рис. 2.3). При натисканні кнопки Create повинен створюватися об'єкт обраного класу: Button – «кнопка» або List – «список»).
Рис. 2.3. Вікно “FormClassRef
При написанні програми використовується той факт, що об'єкти Button і List є елементами керування тобто є похідними від класу TControl.
Визначимо посилання на клас.
type TControlclass=class of TControl;
Визначимо процедуру, що буде виконуватися при натисканні кнопки Create.
procedure TForm1.BtnCreateClick (Sender:TObject);
var Refrence : TControlClass;
Instance: TControl;
begin
if Btn.Checked then Refrence:=TControlClass(TButton) else
Refrence:=TControlClass(TList);
Instance:=Refrence.Create(self);
Instance.Left:=50; Instance.Top:=100;
end;
У змінну Refrence спочатку буде занесений тип обраного елемента, а потім створений об'єкт типу Refrence.
2.2.4.Опис класів в Java
Визначення класу Point в Java виглядає в такий спосіб:
сlass Point {
int x, y;
boolean visible;
void Create(int i,int j, boolean k){
x = i;
y = j;
vivsible = true;}
void SwOn() {...………
void Move(int i, int j){...…………}
}
Особливості визначення:
Імена класів прийнято починати з великої літери.
B Java інтерфейс і реалізація поєднуються усередині класу в буквальному значенні. Це означає, що визначення всіх методів повинні перебувати усередині класу.
Оскільки в Java всі визначення робляться усередині класу, то будь-яка програма на мові Java повинна містити хоча б один клас із методом main, з якого починається виконання програми:
main (String arg[] ) {...…………}
Опис класу зберігається в окремому файлі з розширенням <.java>. Ім'я вихідного файлу java повинне бути таким же, як і ім'я класу, що визначається в ньому. Регістр букв також повинен повністю збігатися.
Область видимості імен класів задається шляхом віднесення класу до того або іншого пакета (package). Класи в пакетах групуються за аналогією з файлами в каталогах, тому в різних пакетах можуть зустрічатися класи з однаковими іменами. Потрібен точний збіг ієрархії пакетів з ієрархією каталогів. Рівні пакетів розділяються крапкою:
package java.util // клас повинен перебувати в каталозі java/util
Каталог, який транслятор Java буде розглядати, як кореневий для ієрархії пакетів, можна задавати за допомогою змінною оточення СLASSPATH. За допомогою цієї змінної можна задати кілька кореневих каталогів для ієрархії пакетів через символ <;>, як у звичайному PATH.
Для повторного використання опису класу використовується оператор import. Цей оператор показує, в якому пакеті шукати потрібні класи:
import java.util.* // використати всі класи з пакета java.util
import java.util.Random // використати клас Random з пакета java.util
Структура визначення класу з урахуванням його віднесення до відповідного пакета й використання класів з інших пакетів наведена нижче:
package <ім'я пакета>
import <список імпортованих пакетів >
……………
<оголошення класу >
Примітка: рекомендується не використовувати оператор import із зірочкою (* – включити всі класи пакета), тому що це може істотно збільшити час трансляції коду.
Класи можуть мати модифікатори abstrac, final або public, які вказуються перед ключовим словом class: аbstract – клас, що містить хоча б один абстрактний метод, final – кінцевий клас і не може мати спадкоємців, public – відкритий клас і до нього можна здійснювати доступ з інших пакетів. Допускається комбінація модифікаторів, наприклад, public final class {……………}. Однак final і abstract не сумісні, тому що являють собою повну протилежність. Модифікатор public завжди оголошується першим, якщо є й інші. Якщо не зазначений жоден модифікатор доступу (за замовчуванням), клас доступний тільки усередині пакета, де він оголошений.
Інтерфейси є особливими класами, у яких поля даних являють собою константи, а оголошення методів містять тільки перерахування параметрів і відсутній блок з операторами тіла методу:
[public] interface Brushes {
<оголошення констант >
<тип> <ім'я методу1>(<список параметрів >);
<тип> <ім'я методу2>(<список параметрів >);
………………………}
Інтерфейс визначає як повинен виглядати клас, але не те, яким чином він працює. Методи, оголошені в інтерфейсах, повинні бути визначені в тих класах які використають ці інтерфейси. Інтерфейс може бути оголошений з модифікатором public, що діє так само, як і для класу, або взагалі без модифікатора, і тоді він доступний тільки у своєму пакеті. Використання інтерфейсу задається оператором implements:
class Point implements Brushes {
// реалізація методів інтерфейсу Brushes
}
Клас повинен містити в собі реалізацію всіх методів інтерфейсу, що він використає.
Так само як і в Smalltalk, в Java використовується поняття метакласа. У ролі такого класу виступає клас Class.