на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Побудова і використання класів
p align="left">Також один клас може бути дружнім для іншого. Це означає, що всі компонентні функції класу є дружніми для іншого класу. Дружній клас повинен бути визначеним за тілом класу, який «надає дружбу». Наприклад, так:

class X2 {friend class1; ...};

class X1 {...

void f1(...);

void f2(...);

... }

};

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

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

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

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

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

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

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

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

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

Form1 -> Hide();

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

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

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

Позначимо деякі особливості використання VCL в Borland C++ 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 (fill color), яка має статус доступу protected. Тобто, ця змінна успадковується та її значення може змінюватися в похідних класах. Колір фону поміщується в змінну backc (back color), яка має статус доступу public. Значення цієї змінної можна буде змінити з тіла основної процедури.

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

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

Така консистенція базового класу classProgressBar була обрана тому що саме параметри, які визначають колір, є загальними для усіх видів Progress Bar, тобто ці параметри будуть раціонально успадковуватися в кожний з похідних від classProgressBar класів з можливістю зміни деяких з них (backc).

2.3.2 Базовий клас font

Також створено базовий клас font, метод my_font якого дозволяє користувачеві встановлювати необхідний шрифт написів. Мотив створення цього класу - такий самий, як в класі classProgressBar. Тобто шрифт є загальним параметром для кожного з можливих Progress Bar.

Перевизначення шрифту реалізується за допомогою функції 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(int x0, int y0), size (int rad) та show, які виконують відповідні аналогічні дії як в класах horBar та vertBar. При об'яві класу-родителя класу ringBar вказано специфікатор virtual в разі використання вказівника на базовий клас roundBar (базовий для ringBar). Клас ringBar має свій метод show, але успадковує методи size (обидва) класу roundBar. Наявність двох функцій-методів в класі roundBar демонструє статичний поліморфізм. Тобто, ідентифікатори у функцій одинакові, а кількість змінних та відповідні дії, які виконуються функціями, - різні. Також в межах класу ringBar перевантажено стандартну функцію “+”. Це перевантаження передбачає збільшення радіуса віконця першого об'єкту при використанні її як суми двох об'єктів класу ringBar. Тобто, таким чином радіус першого об'єкту буде дорівнювати сумі радіусів доданих об'єктів.

Страницы: 1, 2, 3, 4



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.