
- •Передмова
- •Розділ 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.8."Дружні" методи
“Дружній” означає. що хоча метод і не визначається усередині класу, він має доступ до закритих елементів класу.
Примітка: в SmallTalk і Java "друзів" класу нема, тому що все визначається усередині класу.
2.8.1.«Дружні» функції в С++
"Друзі" класу розширюють можливості використання функцій для об'єктів класового типу. У С++ можна визначати функції, яким дозволяється працювати зі змінними, визначеними в класі. Ці функції визначаються зі специфікатором friend.
Розглянемо функцію, що з'ясовує, чи перебуває точка усередині прямокутника:
Int HasPoint (Rectangle &r, Point &p)
{return r.left <= p.x && p.x <= r.right && r.botton >=
p.y && p.y >= r.top;}
Будемо вважати, що змінні left, right, botton, top сховано у своїх класах.
сlass Rectangle;
сlass Point { float x,y;
………………
friend int HasPoint (Rectangle &r, Point &p);};
сlass Rectangle { float left, right, botton, top;
………………
friend int HasPoint (Rectangle &r, Point &p);};
………………
void main (){ Point a;
Rectangle b;
HasPoint(b,a);
}
У даному прикладі поля класів Rectangle і Point є закритими. Тому оголошено дружню функцію HasPoint, що має доступ до полів даних і методів цих класів.
Якщо необхідно зробити "дружніми" всі функції даного класу, то весь клас оголошується "дружнім":
сlass Y { friend class X;
…………......};
Це те ж саме, що й
сlass X { int f();
void g();
…………......};
сlass Y { friend int X::f();
friend void X::g();
…………};
Примітка: "дружба" класів не транзитивна, тобто якщо клас А "дружить" із класом В, а В "дружить" із класом С, то із цього не випливає, що А теж "дружить" із класом С.
2.8.2.Аналог дружніх функцій в Delphi
Властивості "дружніх" функцій в Delphi реалізуються через покажчики на методи. Такий підхід забезпечує розширення можливостей класів шляхом делегування функціональності інших класів, а не породженням підкласів і заміщенням методів. Замість визначення похідного класу з удосконаленими методами використовується покажчик на метод уже існуючого класу.
Розглянемо це на прикладі обробки події OnChange для смуги горизонтального прокручування списку, коли список повинен показувати число смужок залежно від стану смуги прокручування. Спочатку визначимо тип:
Type
TNotifyEvent = procedure (Sender: TObject) of object;
{наприкінці є присутнім of object}
Будь-яка змінна з типом TnotifyEvent повинна бути призначена методу, що приймає єдиний параметр Tobject.
Тепер визначимо клас TscrollBar, що містить покажчик на метод TnotifyEvent:
TscrollBar = class (TWinControl)
private
FOnChange : TNotifyEvent; {визначаємо покажчик на метод}
protected
procedure Change;
public
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
{зв'язуємо властивість OnChange з FOnChange}
implementation
procedure TscrollBar.Change;
begin
If Assigned (FOnChange) then { чи зв'язаний покажчик з методом?}
FOnChange (Self); {виконання методу}
end;
Визначаємо новий клас – форму TForm1 з рядком скролінга:
Type TForm1 = class (TForm)
ScrollBar1: TScrollBar;
ListBox1: TListBox;
procedure ScrollBar1Change (Sender: TObject);
end;
Implementation
procedure TForm1. ScrollBar1Change (Sender: TObject);
begin
ListBox1.Columns:=ScrollBar1.Position;
end;
На етапі виконання:
var TheForm: TForm1;
begin
TheForm:=TForm1.Create(Application);
TheForm.ScrollBar1.OnChange:=TheForm.ScrollBar1Change;
{зв'язуємо OnChange з ScrollBar1Change }
end.
При клацанні на смузі прокручування буде викликаний метод Change, який перевіряє, чи дійсно покажчик FOnChange пов'язаний з яким-небудь методом і якщо «так», то викликається відповідний метод.
С
хема
використання покажчика на метод у даному
прикладі приведена на рис. 2.5.
Рис. 2.5. Схема використання покажчика на метод