
- •Передмова
- •Розділ 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
1.1.3.Складність опису окремих елементів
Фон-Неймановська архітектура обчислень передбачає виконання заздалегідь певної послідовності команд. Такий метод виконання обчислень називається «керування програмою». При цьому будь-яка помилка в послідовності команд може привести до невірного результату. Більше надійним є інший підхід, названий «керування даними». При ньому контроль за обчисленнями покладається не на програму, а на дані, якими оперує програма. Необхідне обчислення виконується тільки тоді, коли готові необхідні для цього дані. Таким чином, дані одержують можливість самостійно контролювати дії над ними.
Наприклад, нехай
потрібно обчислити вираз
.
Для цього необхідно виконати наступні
дії: знайти значення виразів
і
,
а потім їх перемножити. Послідовність
команд, що реалізує дані обчислення,
можна замінити трирівневою структурою
обчислень на основі даних, наведеною
на рис. 1.3. Дана структура забезпечить
правильність обчислень за рахунок
контролю готовності необхідних для
виконання тієї чи іншої операції даних.
Так, додавання й віднімання буде зроблено
тільки після готовності вихідних даних
– величин
,
і
а множення буде виконуватися тільки
після того, як будуть сформовані необхідні
для цього множники
й
.
Таким чином, не потрібно контролювати
хід обчислень шляхом визначення
послідовності команд додавання й
множення. Потрібні операції викликаються
автоматично в міру готовності даних,
необхідних для їхнього виконання.
Р
ис.
1.3. Структура обчислень на основі даних
Перехід на другий рівень відбувається тільки після виконання обчислень першого рівня. Для того, щоб реалізувати механізм керування даними, необхідно змусити елементи обчислювальної структури, що виконують дії (операції), існувати в пам'яті довше, чим це необхідно для виконання дії, тому що вони повинні постійно аналізувати стан даних.
Для реалізації такого підходу не достатнє використання звичайних процедур. Процедура живе в пам'яті тільки на момент обчислення, і вхід у блок операторів процедури можливий тільки через його початок. Після того, як всі обчислення блоку будуть виконані, відбувається вихід із процедури, після чого вона перестає існувати. Для постійного контролю даних необхідно забезпечити довготривалість існування блоку обчислень.
Подолання розглянутих вище складностей може бути реалізоване в мові програмування шляхом введення нової абстракції даних – об'єкта, що здатний зберігатися постійно в пам'яті, звіряючи свої дії зі станом даних. Оскільки об'єкт може мати довільний набір операцій, то для його завдання повинен бути передбачений спеціальний тип, обумовлений користувачем. Такий тип, за аналогією з математичним визначенням множини елементів з подібними властивостями, називається класом. А щоб забезпечити наступність у визначенні об'єктів, що розкривають властивості елементів програми, що перебувають в ієрархічній залежності, варто передбачити можливість спадкування у визначенні класів.
Таким чином, вирішення проблеми складності в програмуванні базується на використанні сукупності об'єктів, кожний з яких є реалізацією деякого класу, а класи можуть утворювати ієрархію за допомогою успадкування. Розглянуті взаємовідносини понять «об'єкта», «класа» і «успадкування» становлять суть об’єктно-орієнтованого програмування, що дозволяє управлятися зі складними програмними системами.