- •Передмова
- •Розділ 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
3.2.Успадкування в SmallTalk
Особливості успадкування в SmallTalk полягають у наступному:
S mallTalk підтримує тільки просте успадкування. Вся ієрархія будується від одного класу Object (рис. 3.3).
Рис. 3.3. Ієрархія класів в SmallTalk
В SmallTalk існує дві паралельні ієрархії класів: ієрархія класів і ієрархія метакласів, зв'язок між якими показана на рис. 3.4.
Рис. 3.4. Зв'язок ієрархій класів і метакласів: пунктірною лінією показане відношення між класами типу «клас а є екземпляром класу в», суцільною лінією – «клас а є підкласом класу в»
Кожний підклас успадковує змінні класу, змінні екземпляра й методи суперкласу. У результаті виходить так, що якщо базовий клас має два змінні класи A і B, два змінні екземпляри x і y а підклас два змінні класи C і D, два змінні екземпляри z і s, те в екземплярі підкласу доступні змінні A, B, C, D, x, y, z, s У зв'язку із цим імена змінних у підкласах повинні відрізнятися від імен у суперкласах. Приклад опису класу і його підкласу наведений нижче.
Object subclass: #OneClass
instanceVariableNames: 'x y'
classVariableNames: 'A B'
…………………………
OneClass subclass: #TwoClass
instanceVariableNames: 'z s'
classVariableNames: 'C D'
На відміну від механізму успадкування змінних підклас може містити методи, однойменні з методами суперкласу. У цьому випадку відбувається перевизначення методів суперкласу. Для виклику методів суперкласу потрібно використати змінну super.
Не всі методи SmallTalk реалізуються за допомогою мови. Деякі реалізуються за допомогою примітивів базової віртуальної машини SmallTalk.
3.3.Успадкування в С++
Можливості успадкування в С++ значно більші, ніж в SmallTalk. Насамперед, це пов'язане з тим, що в С++ явно підтримуються обидва способи успадкування: просте й множинне. Даний факт виражається в тім, що при описі похідного класу (підкласу) може вказуватися цілий список успадкованих (базових) класів (перерахування базових класів робиться після двокрапки відразу за ім'ям похідного класу:
сlass D: A, B, C {...……………}; //клас D успадковує класи A, B і З
Інші особливості успадкування в С++ полягають у наступному:
Базові класи можуть бути визначені зі специфікаторами доступу public і private:
сlass X: public Y {...…………......};
сlass Z: private Y {...…………......};
За замовчуванням базовий клас визначається, як private, а базова структура, як public:
class Y: B, public C {...…}; // клас В - private, клас ІЗ - public
struct S: private D, E {...…}; // клас D - клас private, клас E - public
Використовуючи специфікатори доступу, можна перевизначити правила доступу до класу відповідно до правил, наведених в табл. 3.1.
Таблиця 3.1
Правила доступу до елементів класу при успадкуванні
-
Доступ у базовому класі
Специфікатор доступу
Доступ у похідному класі
public
public
public
private
public
немає доступу
protected
public
protected
public
private
private
private
private
немає доступу
protected
private
private
Таким чином, специфікатор рublic залишає доступ до змінних базового класу без зміни, за винятком змінних private, які недоступні в похідному класі в кожному разі. Специфікатор private робить всі змінні похідного класу private, але змінні базового класу однаково не будуть доступні похідному класу.
Дії окремих специфікаторів доступу можна скорегувати, наприклад, у такий спосіб:
сlass B { int a;
public:
int b, c;
………………};
class A: B { int d; // клас B - private
public:
B::c; // змінна c була private, а стала public
………………};
За допомогою кваліфікатора “::” можна звернутися до однойменних змінних базового й похідного класів. Таким чином, у похідних класах можуть бути використані змінні, однойменні зі змінними базових класів:
int y;
X::y=y;