
- •Передмова
- •Розділ 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.7.Методи
Через методи реалізується поведінка об'єкта. Фактично, методи визначають операції, що виконуються над об'єктами.
Розрізняють 5 видів операцій над об'єктами:
Модифікатори - операції, які змінюють стан об'єкта.
Селектори - операції, що надають доступ до полів даних об'єктів.
Ітератори - всі допоміжні операції.
Конструктори - операції створення й ініціалізації об'єктів.
Деструктори - операції руйнування об'єктів і звільнення займаної ними пам'яті.
В SmallTalk і Java всі операції задаються усередині методів. У С++ і Object Pascal операції над об'єктами можуть бути задані поза методами, наприклад у тілі "дружньої" функції. По суті методи, як і функції й процедури, є об'єднанням декількох або однієї операцій (крім абстрактних методів) і визначають ту або іншу дію об'єкта. Однак методи завжди інкапсульовані у класі.
2.7.1.Загальна схема визначення методу
Всі методи будуються за схемою:
<метод >:=< заголовок методу >< тіло методу >
<заголовок методу >:= [<тип >]<ім'я методу >[<параметри методу >]
Наприклад, у різних мовах програмування заголовок методу «Замінити елемент на об'єкт» виглядає в такий спосіб:
SmallTalk: at: anInt put: anObject
C++: void atPut(int anInt, x& anObject);
Delphi: atPut(anInt:integer; anObj:TObject);
Java: void atPut(int anInt, x& anObject);
2.7.2.Визначення методів в SmallTalk
Як і дані, методи в SmallTalk підрозділяються на методи класу й методи екземпляри класу:
Array new. // метод класу
Time now. // метод класу
Turtle home. // метод екземпляра класу, тому що Turtle об'єкт класу Pen
Pen new Count.
Методи класу адресуються класам, а методи екземплярів класу – об'єктам. Визначення методів класу й методів екземпляра класу виконується у вікні Browser Class, як це описано в п. 2.2. 1.
2.7.3.Визначення методів в C++
Особливості визначення:
Всі методи реалізуються як функції, а значить при їхньому визначенні вказується тип значення, що повертається. Якщо нічого не вертається, вказується тип void.
У прототипах функцій, що оголошуються в інтерфейсі, можуть вказуватися тільки типи параметрів:
void g(int, double, char);
Допускається перевантаження методів: оголошення функцій з однаковими іменами. Функції, що перевантажуються, повинні відрізнятися або числом, або типом параметрів (тип значення, що повертає, в увагу не приймається):
void f (int);
int f (int); // помилка!
Допускається використання параметрів за замовчуванням, які повинні бути зазначені останніми в списку параметрів:
void f (float x, int y=1, char a='A');
Дана функція може бути викликана у вигляді:
f (0.5); // x=0.5; y=1; a='A'
Допускається визначення вкладених функцій (inline). Можливі два варіанти визначення таких функцій:
будь-яка функція, що визначена усередині класу, автоматично стає inline:
class X { int i;
void f() {
……………… // тіло функції
}
};
inline-функцію можна вказати явно в розділі реалізації
сlass X { int i;
void f();
………………
};
inline X::f() {...………………}
Примітка: вкладені функції забезпечують більш швидкий виклик і виконання за рахунок підстановки компілятором коду функції в місце її виклику. Однак це спричиняє збільшення розміру об'єктного коду. Тому вбудовані функції повинні бути незначними по обсязі.
Можуть бути визначені методи класу, які оголошуються із ключовим словом static:
class A { int i,j ; // змінні екземпляра класу
static int f() ; // метод класу
}a; *p;
Класові методи можна викликати без прив'язки до екземплярів класу, вказуючи як кваліфікацію ім'я класу:
A::f();
Оскільки статичні функції повинні використовувати тільки статичні поля, то їх можна викликати й через екземпляри класу:
a.f();