Смекни!
smekni.com

Побудова і використання класів (стр. 3 из 5)

Тут тип_оператора визначає тип повертає мого значення при виконанні перевизначеної операції; в круглих дужках задається список типів параметрів, при наявності яких у аргументів звернення до операції до операцій з даним знаком буде виконуватися перевантаження (виклик) саме цього екземпляру операції. [2]

Один з варіантів використання поліморфізму – віртуальні функції. Якщо при використанні віртуальної функції запит здійснюється з допомогою вказівника базового класу (або посилання), то С++ вибирає правильно перевизначену функцію у відповідному похідному класі, який зв’язаний з цим об’єктом.

Іноді функція-елемент визначається в базовому класі як віртуальна, але перевизначена в похідному класі. Якщо така функція-елемент викликається через вказівник похідного класу, то використовується версія похідного класу. Це не поліморфна поведінка.

Завдяки використанню поліморфних функцій та поліморфізму виклик функції-елемента може привести до різних дій, які залежать від типу об’єкту, який викликається. [5]

Як вже було сказано, механізм керування доступом дозволяє виділяти загальнодоступні (public), захищені (protected) та власні (private) компоненти класів. Захищені компоненти доступні всередині класу та в похідних класах. Власні компоненти локалізовані в класі та недоступні ззовні. З допомогою загальнодоступних компонентів реалізується взаємодія класу з будь-якими частинами програми. Проте, є ще одна можливість розширити інтерфейс класу. Це забезпечують дружні функції. За визначенням, дружньою функцією класу є функція, яка не будучи його компонентом, має доступ до його захищених та власних компонентів. Функція не може стати другом класу «без його згоди». Для отримання прав друга функція повинна бути описана в тілі класу із специфікатором friend. Саме при наявності такого опису клас дає функції права доступу до захищених та власних компонентів.

Приклад роботи класу з дружньою функцією.

#include <conio.h>//для консольних функцій у текстовому режимі

//клас «символ у заданій позиції екрану»

classcharlocus

{

intx, y; //координати місця символу на екрані

charcc;

//прототип дружньої функції для заміни символу

friend void friend_put (charlocus*, char);

public:

charlocus (int xi, int yi, char ci)//конструктор

{

x = xi;

y = yi;

cc = ci;

}

voiddisplay (void) //вивести символ на екран

{

gotoxy(x, y);

putch(cc);

}

}

//дружня функція заміни символа в конкретному об’єкті

void friend_put(charlocus *p, char c)

{

p -> cc = c;

}

void main()

{

charlocus D(20, 4, ‘d’);//створити об’єкт

charlocusS(10, 10, ‘s’); //створити об’єкт

clrscr(); //очистити екран

D.display(); getch(); S.display(); getch();

friend_put(&D, ‘*’); D.display(); getch();

friend_put(&S, ‘#’); S.display(); getch();

}

Програма послідовно виводить на екран d (в позицію 20, 4), sв позицію (10, 10), * (в позицію 20, 4), # (в позицію 10, 10).

Також один клас може бути дружнім для іншого. Це означає, що всі компонентні функції класу є дружніми для іншого класу. Дружній клас повинен бути визначеним за тілом класу, який «надає дружбу». Наприклад, так:

class X2 {friend class1; ...};

class X1 {...

void f1(...);

void f2(...);

... }

};


В даному випадку функції f1 та f2 із класу x1 є друзями класу x2, хоча вони описуються без специфікатора friend.

Усі компоненти класу доступні у дружньому класі. Дружній клас може бути визначеним перед тим, як описаний як дружній. [3]

Для розв’язання деяких задач дуже зручно використовувати параметризовані класи на основі шаблонів. Шаблон – це спеціальний опис родової (параметризованої) функції або класу, у яких інформація об використаних в реалізації типах даних спеціально остається незаданою. Типи використаних даних передаються через параметри шаблону. Апарат шаблонів дозволяє одну й ту саму функцію або клас використовувати з різними типами даних без необхідності програмувати заново кожну версію функції або класу.

Компілятор автоматично породжує стільки різних версій функцій або класів, скільки потрібно для опрацювання кожного із знов використаних типів. [2]

1.5 Розробка класів з використанням технології візуального програмування

Розглянемо технологію розробки класів в системі програмування BorlandC++ Builder. Це – одна з сучасних систем, яка має розвинені можливості та підтримую концепцію об’єктно-орієнтованого та візуального програмування.

В системі BorlandC++ Builder бібліотекою класів є бібліотека візуальних компонентів (VCL). Особливості бібліотеки полягають у тому, що компонентами, які використовуються в програмі, можна управляти за допомогою методів, властивостей та об’єктів.

Існує три елемента керування об’єктами: властивості, методи та події. Властивості об’єкта визначають його характеристики та поведінку. Наприклад, для об’єкта форма (вікно) властивість Caption визначаю назву в виді тексту, яка буде відображатися в верхній частині вікна, Color задає колір вікна, Width – його ширину і т.д.

Методи, на відміну від властивостей, які представляють собою змінні або об’єкти, методи представляють собою функції-члени класу (об’єкту), які можна викликати ззовні для керування об’єктом. Наприклад, щоб вікно стало невидимим в процесі робот програми, можна викликати наступний метод:

Form1 –> Hide();

Щоб вікно стало знову видимим, треба викликати інший метод:

Form1 –> Show(); і т.д.

Третій елемент керування об’єктом – події. Для кожного об’єкта із VCLіснує свій перелік подій, для яких можна замінити стандартну реакцію програми.

Позначимо деякі особливості використання VCLв BorlandC++ Builder. Сама бібліотека VCLнаписана на Об’єктному Паскалі. Це обумовлює ряд обмежень на її використання, тому що Об’єктний Паскаль уступає в потужності реалізації принципів ООП на мові С++. VCLне допускає використання перевантажений функцій; використані функції-члени класу не мають аргументів за замовченням; класи із VCLне підтримують множинне успадкування. Вказані особливості ведуть до зниження гнучкості використання VCL. Однак переваги концепції візуального програмування роблять ці недоліки бібліотеки VCL малозначними. [2]


2. Розробка класу classProgressBar

2.1 Постановка задачі та обрані методи її розв’язку

В цій курсовій роботі розроблено клас classProgressBar, на основі якого побудовано ієрархію класів, яка дозволяє створювати об’єкти типу «смужка прогресу». Можливо створити смужку прогресу чотирьох форм – горизонтальну (похідний клас horBar), вертикальну (похідний клас vertBar), смужку у формі кола (похідний клас roundBar) та смужку у формі кільця (похідний клас ringBar).

Базові класи classProgressBar та fontмістять методи та дані, загальні для усіх успадкованих класів. Як вже позначалося, пара базових класів потрібна для демонстрації множинного успадкування. Взагалі структуру базових класів з їхніми методами та даними можна представити наступним чином:

Мал. 2. Структура базових класів

Пунктирними стрілками показано, що немає різниці, якому з базових класів належить метод. В загальному випадку можна всі методи помістити в один базовий клас (classProgressBar) і вже від нього успадковувати всі інші класи. Але в цьому випадку втратиться можливість продемонструвати множинне успадкування. Теж саме можна сказати щодо даних базових класів.

Таким чином, кожен з успадкованих класів успадковує методи для зміни кольору тексту, смужки та фону (classProgressBar) та зміни шрифту тексту (font).

В успадкованих класах в залежності від задачі описані «індивідуальні» методи. Взагалі кожен з успадкованих класів має конструктор для ініціалізації об’єкту, а також методи для встановлення розміру віконця, встановлення необхідних кольорових характеристик, шрифту, та функцію, яка виводить об’єкт на екран.

2.2 Реалізовані концепції ООП

Реалізація програми проводилася з використанням основних концепцій ООП. В даному випадку дуже зручно використати саме концепції ООП, оскільки при роботі програми будується ієрархія відповідних класів (успадкування), використовуються однойменні функції (поліморфізм), а ініціалізація об’єктів реалізуються через конструктори (інкапсуляція). Використання цих концепцій дозволило по-перше, чітко визначити межі між об’єктами (за допомогою використання класів), по-друге, це позволило скоротити програмний код за рахунок використання в успадкованих класах функцій, описаних в базових класах. Нарешті, по-третє, використання конструкторів в класах дозволило автоматизувати процес ініціалізації об’єктів.

На основі базових класів classProgressBar та font була побудована ієрархія класів з використанням множинного та поодинокого успадкування. Множинне успадкування продемонстроване на успадкуванні класів horBar, vertBar та roundBar. Одиночне успадкування продемонстровано на успадкуванні класу ringBar.

Динамічний поліморфізм реалізується з використанням віртуальної функції-метода my_colors, описаної в класі classProgressBar. Таким чином, можна перевантажити цю функцію в похідних від classProgressBarкласах. Статичний поліморфізм використовується в класах roundBar та ringBar стосовно методів size. Тобто, методи size успадковуються класом ringBarта можуть бути перевантажені в ньому.

Схема успадкування показана на малюнку 2.

Мал. 3. Схема успадкування

2.3 Опис класів

2.3.1 Базовий клас classProgresBar

Базовий клас classProgressBar містить віртуальну функцію-метод my_colors, який дозволяє користувачеві вибрати колір шрифту, колір фону та колір смужки. Колір заповнення смужки поміщується в змінну fillc (fillcolor), яка має статус доступу protected. Тобто, ця змінна успадковується та її значення може змінюватися в похідних класах. Колір фону поміщується в змінну backc (backcolor), яка має статус доступу public. Значення цієї змінної можна буде змінити з тіла основної процедури.

Віртуальна функція my_colorsвизначена з метою її можливого перевизначення в одному з успадкованих класів, тобто таким чином продемонстровано механізм віртуальних функцій.

Перевизначення кольору тексту реалізується з допомогою функції setcolor модуля graphics.h, а перевизначення кольору фону реалізується з допомогою функції setbkcolor того ж самого модуля.