
- •Передмова
- •Розділ 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
5.2.2.Визначення контейнерних класів
Стандартна техніка програмування в С++ заснована на використанні принципу підстановки при створенні контейнерного класу. Згідно цього принципу, змінній, оголошеної з певним типом, може бути привласнене значення підтипу. Тобто, варто створити список, елементами якого будуть екземпляри типу Object, і тільки при вийманні елемента зі списку потрібно буде застосувати операцію явного приведення типів. Однак варто враховувати, що С++ не підтримує підстановку для об'єктів. Підтримка даного принципу відбувається тільки для покажчиків і посилань. Із цієї причини контейнерні класи розробляються так, щоб зберігати покажчики на об'єкти, але не самі об'єкти.
Приклад побудови списку покажчиків загального виду void*:
class aList {
private:
listelem* firstelem; // початок списку (заголовок)
public:
alist () {firstelem = 0;} // 0 - порожній список
void addToList (void* newelem); // додавання в початок списку
void* first(); // витяг першого елемента
};
class listelem {
public:
void* value;
listelem* next; // зв'язаний елемент
};
void aList::addToList (void* newelem){
listelem* temp = new listelem; // створення нового елемента
temp > next = firstelem; // приєднання до списку
temp > value = newelem;
firstelem = temp; // модифікація заголовка списку
}
5.2.3.Стандартні контейнерні класи
Замість розробки власних контейнерних класів (списків, черг, масивів і т.д.) можна використати вбудовані класи С++, наприклад клас List. Даний клас є похідним від класу Container і являє собою сукупність об'єктів класу ListElement, що утворять односпрямований неупорядкований список. Всі операції по обробці списку виконують функції дружнього класу ListIterator, екземпляр якого ініціалізується методом класу ListInitIterator. Перебір починається з голови списку й триває до досягнення його останнього елемента. Значення в класі ListElement визначені як покажчики на клас Object.
Приклад програми побудови списку книг з використанням стандартного класу приводиться нижче.
#include <list.h>
void main (void){
List book_list; // створення екземпляра списку
while (1){
Book work; // створення робочого елемента класу Book
if (work.input_Book() = = END_INPUT) break;
booklist.add (*new Book(work));// створення екземпляра Book і
//додавання його в список
};
while (!book_list.isEmpty()){
Book& outbook = (Book&)book_list.peekHead(); // вибір першого
//елемента
book_list.detach(out_book,1); // видаляється елемент out_book,
//якщо параметр 0; елемент руйнується
};
}
При опису похідних класів від Object, наприклад,
class Book: public Object {...………};
необхідно визначити всі чисті віртуальні функції класу Object:
virtual classType is() - повертає інформацію про клас, до якого належить об'єкт, може бути константою;
virtual char* nameOf()– повертає рядок з ім'ям класу;
virtual HashValueType hashValue() – повертає унікальний ключ, пов'язаний з об'єктом, звичайно повертає 0;
virtual int isEqual(const Object) – порівняння об'єктів, повертає 1;
virtual void printOn() – виведення змісту полів об'єкта в зручному форматі.
5.3.STL – стандартна бібліотека шаблонів
Дана бібліотека була створена під керівництвом А. Степанова й Менга Чи. Поштовхом до її створення послужила робота з мовою Ada. STL (Standard Template Library) містить класи для векторів, списків, множин, словників, стеків, черг і черг із пріоритетом, тобто контейнерні класи.