
- •Передмова
- •Розділ 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.Особливості опису класів у мовах ооп
2.2.1.Опис класів в SmallTalk
SmallTalk є мовою інтерпретуючого типу, що вимагає для своєї реалізації наявність віртуальної SmallTalk-орієнтованої машини. У даній мові реалізація класу винесена з визначення класу. Для створення класів і визначення методів використовуються різні вікна графічного середовища SmallTalk.
Браузер класів представляє клас у вигляді:
ClassName: Point
instanceVariableNames: ‘ x y visible’ ‘‘ змінні об'єкта ’’
ClassVariableNames: '< список змінних класу >''
Особливості визначень:
В SmallTalk об'єкти прийнято називати екземплярами класу (instance).
Змінні екземпляра (instanceVariable) визначають властивості кожного екземпляра класу. Кожний об'єкт має набір змінних екземпляра.
Змінні класу (ClassVariable) створюються для всього класу тільки один раз і є глобальними для всіх екземплярів даного класу.
В окремому вікні представляється список методів даного класу.
сlassMethods
. . . . . . . . . . . .
instanceMethods
Create x: y:
SwOn
move x: y:
Реалізація методів представлена у вікні браузера методів. Наприклад, реалізація методу Create буде мати такий вигляд:
Create x: anInt y: anInt
x:= anInt.
y:= anInt.
visible:=TRUE.
В SmallTalk існує поняття Метакласу. Метаклас – це клас із ім'ям, що складається з імені класу й слова class. Об'єктом метакласу є клас. Класом всіх метакласів є клас MetaClass. Нижче наведені приклади посилки повідомлення class об'єктам-класам і метакласам для одержання імені класу об'єкта:
Pen class Pen class “метоклас класу Pen”
Turtle class Pen “клас об'єкта Turtle”
Pen class class Metaclass “клас метакласа Pen class”
2.2.2.Опис класів в C++
Клас “Точка” у мові С++ визначається в такий спосіб:
// інтерфейс
сlass Point {
int x, y, visible;
void Create(int x,int y);
void SwOn();
void Move(int x, int y);
};
// реалізація
void Point::SwOn() {
visible=1;
}
Особливості визначення:
Як ключове слово, що задає класовий тип, можуть застосовуватися: class (клас), struct (структура), union (об'єднання).
Методи називаються функціями-елементами класу.
В інтерфейсі вказуються тільки прототипи функцій, які мають тільки тип значення, що повертається, назву методу й перерахування типів параметрів.
Реалізація методів приводиться після визначення класів. Приналежність методу до класу вказується за допомогою позначення ‘‘::’’, що називається кваліфікацією.
Допускається попереднє визначення класу з умовою того, що надалі він повинен бути обов'язково визначений:
class X;
…………......
<визначення класу Х>
Елементами класу можуть бути будь-які типи (фундаментальні, або прості типи int, char, word і т.і., покажчики, а також класи й навіть покажчики на власний клас:
class X {Х * xptr;};
Можуть визначатися вкладені класи:
class A {
int x;
class B {int y;};
int g(B*);
};
………………………………………
int A::g(B* p) { p->y;} // помилка!
Примітка: Вкладені класи вважаються приналежними до контексту зовнішнього блоку, що охоплює, у якому визначений основний клас. У зв'язку із цим змінна y класі B не припустима у визначенні функції g класу A.
Як правило, інтерфейсна частина визначення класу включається в файли- заголовки, наприклад, first.h, а реалізація функцій (методів) включається у файл із вихідним кодом, наприклад, first.cpp. При роботі із багатомодульними програмами заголовний файл із визначенням класу повинен включатися в усі модулі, де використовуються об'єкти даного класу.
Шаблони, або генератори, класу дозволяють визначити структуру сімейства класів, по якій компілятор створює автоматично потрібний клас. Шаблони використовуються в тих випадках, коли для об'єктів різних класів використовуються однакові процедури обробки, наприклад, у контейнерних класах.
Приклад шаблона для класу Вектор:
template <class T, int size> // T і size – параметри настроювання
class Vector { T * elem;
public: void print_size();};
template <class T, int size> void Vector <T, size>::print_size()
{cout << '' Усього елементів '' << size;}
Використання шаблона:
void main() {
Vector <int,10> i;
Vector <double,10> d;
Vector <char,10> c;
i.print_size(); // буде виведено: «Усього елементів 10»
}
По заданому визначенню шаблона компілятор створить три окремих класи для векторів, що складаються із цілих, дійсних і символьних елементів.