АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Класи, компоненти і об'єкти

Клас не має фізичної суті, його найближчою аналогією є оголошення структури. Пам'ять виділяється тільки тоді, коли клас використовується для створення об'єкту. Цей процес також називається створенням екземпляра класу (class instance).

Будь-який об'єкт мови C++ має однакові атрибути і функціональність з іншими об'єктами того ж класу. За створення своїх класів і поведінку об'єктів цих класів повну відповідальність несе сам програміст. Працюючи в деякому середовищі, програміст дістає доступ до обширних бібліотек стандартних класів (наприклад, до Бібліотеки Візуальних Компонентів C++Builder).

Зазвичай, об'єкт знаходиться в деякому унікальному стані, визначений поточними значеннями його атрибутів. Функціональність об'єктного класу визначається можливими операціями над екземпляром цього класу.

Визначення класу в мові C++ містить інкапсуляцію членів даних і методів, що оперують з членами даних і таких, що визначають поведінку об'єкту. Повертаючись до нашого прикладу, відзначимо, що рідкокристалічний дисплей годинника "Casio" представляє член даних цього об'єкту, а кнопки управління - об'єктні методи. Натискаючи кнопки годинника, можна оперувати з установками часу на дисплеї, тобто слідуючи термінології ООП, методи модифікують стан об'єкту шляхом зміни членів даних.

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

Властивості (properties) компонента є розширення поняття членів даних і хоча не зберігають дані як такі, проте забезпечують доступ до членів даних об'єктів. C++Builder використовує ключове слово _ property для оголошення властивостей. За допомогою подій (events) компонент повідомляє користувача про те, що на неї надана деяка зумовлена дія. Основна сфера застосування методів в програмах, що розробляються в середовищі C++Builder - це обробники подій (event handlers), які реалізують реакцію програми на виникнення певних подій. Легко відмітити деяку схожість подій і повідомлень операційної системи Windows. Типові прості події — натискання кнопки або клавіші на клавіатурі. Компоненти інкапсулюють свої властивості, методи і події.

На перший погляд компоненти нічим не відрізняються від інших об'єктних класів мови C++, за винятком ряду особливостей, серед яких поки відзначимо наступні:

• Більшість компонентів є елементами управління інтерфейсом з користувачем, причому деякі володіють дуже складною поведінкою.

• Всі компоненти є прямими або непрямими нащадками одного загального класу - нащадок (TComponent).

• Компоненти зазвичай використовуються безпосередньо, шляхом маніпуляції з їх властивостями; вони самі не можуть служити базовими класами для побудови нових підкласів.

• Компоненти розміщуються тільки в динамічній пам'яті купи (heap) за допомогою оператора new а не на стеку, як об'єкти звичайних класів.

• Властивості компоненів містять в собі RTTI - ідентифікацію динамічних типів.

• Компоненти можна додавати до Палітри компоненів і далі маніпулювати з ними за допомогою Редактора форм інтегрованого середовища візуальної розробки C++Builder.

ООП інтерпретує взаємодія з об'єктами як посилку запитів деякому об'єкту або між об'єктами. Об'єкт, що прийняв запит, реагує викликом відповідного методу. На відміну від інших мов ООП, таких як SmallTalk, C++ не заохочує використання поняття "запит". Запит - це те, що робиться з об'єктом, а метод - це те, як об'єкт реагує на запит, що поступив.

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

Саме прихований зв'язок методу з включаючим класом виділяє його з поняття простої функції. Під час виконання методу він має доступ до всіх даних свого класу, хоча і не вимагає явної специфікації імені цього класу. Це забезпечується передачею кожному, без виключення, методу прихованого параметра - непостійного покажчика this на екземпляр класу. При будь-якому зверненні методу до членів даних класу, компілятор генерує спеціальний код, що використовує покажчик this.

Спадкоємство

Однією з найчудовіших особливостей живої природи є її здатність породжувати потомство, що володіє характеристиками, схожими з характеристиками попереднього покоління. Запозичена у природи ідея спадкоємства вирішує проблему модифікації поведінки об'єктів і додає ООП виняткову силу і гнучкість. Спадкоємство дозволяє, практично без обмежень, послідовно будувати і розширювати класи, створені вами або кимось ще. Починаючи з найпростіших класів, можна створювати похідні класи зростаючої складності, які не тільки легкі у відладці, але і прості згідно внутрішньої структури.

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

При спадкоємстві базовий клас обростає новими атрибутами і операціями. У похідному класі зазвичай оголошуються нові члени даних, властивості і методи. При роботі з об'єктами програміст зазвичай підбирає найбільш відповідний клас для вирішення конкретного завдання і створює одного або декількох нащадків від нього, які набувають здатності робити не тільки те, що закладене в батьку. Дружні функції дозволяють похідному класу дістати доступ до всіх членів даних зовнішніх класів.

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

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

Розробка класів

Класи розробляються для досягнення певної мети. Найчастіше програміст починає з нечітко обкресленої ідеї, яка поступово, у міру розробки проекту, поповнюється деталями. Іноді справа закінчується декількома класами, вельми схожими один на одного. Щоб уникнути подібного дублювання код в класах, слід розбити їх на дві частини, визначивши загальну частину в батьківському класі, а що відрізняються залишити в похідних.

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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)