Курсовая работа: Побудова і використання класів
Мал. 3. Схема успадкування
2.3 Опис класів
2.3.1 Базовий клас classProgresBar
Базовий клас classProgressBar містить віртуальну функцію-метод my_colors, який дозволяє користувачеві вибрати колір шрифту, колір фону та колір смужки. Колір заповнення смужки поміщується в змінну fillc (fillcolor), яка має статус доступу protected. Тобто, ця змінна успадковується та її значення може змінюватися в похідних класах. Колір фону поміщується в змінну backc (backcolor), яка має статус доступу public. Значення цієї змінної можна буде змінити з тіла основної процедури.
Віртуальна функція my_colorsвизначена з метою її можливого перевизначення в одному з успадкованих класів, тобто таким чином продемонстровано механізм віртуальних функцій.
Перевизначення кольору тексту реалізується з допомогою функції setcolor модуля graphics.h, а перевизначення кольору фону реалізується з допомогою функції setbkcolor того ж самого модуля.
Така консистенція базового класу classProgressBar була обрана тому що саме параметри, які визначають колір, є загальними для усіх видів ProgressBar, тобто ці параметри будуть раціонально успадковуватися в кожний з похідних від classProgressBar класів з можливістю зміни деяких з них (backc).
2.3.2 Базовий клас font
Також створено базовий клас font, метод my_font якого дозволяє користувачеві встановлювати необхідний шрифт написів. Мотив створення цього класу – такий самий, як в класі classProgressBar. Тобто шрифт є загальним параметром для кожного з можливих ProgressBar.
Перевизначення шрифту реалізується за допомогою функції settextstyle модуля graphics.h. Перший аргумент показує номер обраного шрифту, другий – направлення тексту, третій – розмір букв. Оскільки нас цікавить саме шрифт тексту, то два других параметри прирівнюємо до 0.
2.3.3 Похідні класи horBar, vertBar, roundBar та ringBar
Клас horBar є похідним від класів font та classProgressBar. Похідний клас horBar надає можливість створювати горизонтальну смужку прогресу. Цей клас містить конструктор, за допомогою якого користувач може ввести необхідний відсоток прогресу (від 0 до 100) відповідно до обсягу виконаної роботи. Значення цього відсотку буде міститься у змінній p, яка має статус доступу protected. Це зроблено для того, щоб на основі класу horBar можна було створювати похідні класи, і при цьому відсоток виконаної роботи зберігається. Треба наголосити, що всі смужки прогресу в даній курсовій роботі представляють собою окремі об’єкти без прив’язки до конкретної дії. Тобто користувач сам обирає скільки відсотків прогресу пройдено після певної дії.
Метод sizeцього класу задає лінійні параметри віконця смужки прогресу. Аргументами цього методу є координати верхнього лівого та нижнього правого кутів віконця. Для демонстрації динамічного поліморфізму в класі horBar створено конструктор копіювання. Тобто, при тестуванні цього класу спочатку буде створюватися певний об’єкт за допомогою основного конструктора, далі буде створена копія цього об’єкту за допомогою конструктора копіювання і методи класу horBar будуть приміняться до об’єкта-копії. Оскільки при створені об’єктів таким чином використовується динамічна пам’ять, то при закінченні роботи об’єктів використовуються однойменний деструктор для визволення використаного об’єму динамічної пам’яті.
Метод show класу horBar виконує дві функції: по-перше, цей метод надає можливість користувачеві міняти положення віконця смужки прогресу на екрані (можна переміщувати віконце вправо – d, вліво – a, вниз – s, вгору - w). Переміщення припиняється після натискання кнопки r. По-друге, вже після вибору місця положення віконця на екрані, метод show заповнює відповідну частину смужки прогресу певним кольором. Структура методу showє приблизно однаковою для всіх класах.
В класі horBarперевантажена віртуальна функція my_colors. Тобто перевизначити кольори можна також із класу horBar. Взагалі, використання віртуальної функції в даному випадку не є раціональним, оскільки метод my_colors і так буде успадковуватися в клас horBar. Використання віртуальної функції тут є прикладом використання концепції динамічного поліморфізму.
Підчас заповнення смужки прогресу у верхній частині екрану можна побачити відсоток заповнення. На відмітках 25%, 50%, 75% та 100% внутрішній динамік комп’ютера подає звуковий сигнал частотою 500 Гц тривалістю 0,3 сек для зручнішої орієнтації в обсязі виконаної роботи.
Аналогічний принцип дії має клас vertBar, на основі якого можна створювати вертикальні смужки прогресу. Цей клас також успадковуються від базових класів classProgressBar та font. Конструктор, деструктор та методи size, show класу vertBar виконують такі ж самі дії, що і в класі horBar, тільки у відповідних координатах (тобто, щоб смужка прогресу росла вгору). Також в класі vertBar визначена дружня функція my_size, яка може відігравати роль методу size, тобто визначення границь віконця. Функція my_size описана поза класу vertBar (як і треба для дружньої функції). Використання дружньої функції є раціональним, якщо вона використовується в декількох класах і в основній програмі. Тобто, це дозволяє скоротити програмний код. В нашому випадку використання дружньої функції не є раціональним, тому що вона використовується лише для класу vertBar.
Ще одною різницею між класами horBar та vertBar є те, що в останньому відсутній конструктор копіювання, і об’єкт, створений на основі цього класу ініциалізується за допомогою базового конструктора.
Класів ringBar (смужка прогресу в вигляді кільця) є похідним від класу roundBar (смужка прогресу у виді кругу), який в свою чергу успадковується від базових класів classProgressBar та font. Успадкування класів horBar, vertBar та roundBar від базових класів classProgressBar та font демонструє концепцію множинного успадкування. В цій курсовій роботі використання множинного успадкування є чисто демонстративним і не є раціональним, тому що один-єдиний метод класу font (my_font) можна було б помістити в клас classProgressBar. Використання множинного успадкування говорить о том, що методи та дані базових класів є загальними для усіх похідних (успадкованих) класів. Дійсно, вибір кольорів шрифту, фону, смужки прогресу та шрифту є загальними діями для усіх похідних класів.
Концепція поодинокого успадкування демонструється на успадкуванні класу ringBar від класу roundBar. Клас roundBar має конструктор, деструктор, методи size(intx0, inty0), size (intrad) та show, які виконують відповідні аналогічні дії як в класах horBar та vertBar. При об’яві класу-родителя класу ringBar вказано специфікатор virtual в разі використання вказівника на базовий клас roundBar (базовий для ringBar). Клас ringBar має свій метод show, але успадковує методи size (обидва) класу roundBar. Наявність двох функцій-методів в класі roundBar демонструє статичний поліморфізм. Тобто, ідентифікатори у функцій одинакові, а кількість змінних та відповідні дії, які виконуються функціями, – різні. Також в межах класу ringBar перевантажено стандартну функцію “+”. Це перевантаження передбачає збільшення радіуса віконця першого об’єкту при використанні її як суми двох об’єктів класу ringBar. Тобто, таким чином радіус першого об’єкту буде дорівнювати сумі радіусів доданих об’єктів.
Заповнення круга відповідним кольором в класі roundBar відбуваєть