Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Теоретичні основи об’єктно-орієнтованого програмування



Питання для опрацювання

1. Базові поняття об’єктно‑орієнтованого програмування (ООП).

2. Успадкування та поліморфізм.

3. Практичні прийоми програмування з використанням об’єктів.

Методичні рекомендації

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

1. Базові поняття об’єктно‑орієнтованого програмування (ООП).

Із розвитком ОС Windows все більшої популярності набирав віконний інтерфейс програмного забезпечення. Тому виникла потреба щодо створення таких програм, інтерфейс яких нагадує інтерфейс роботи з вікнами ОС Windows. В результаті чого і виник стиль візуального програмування, який базується на принципах і методах об’єктно-орієнтованого програмування з одної сторони, і на віконній концепції ОС Windows з іншої.

    Головною особливістю візуального програмування (від лат. vіsualіs - зоровий) є створення інтерфейсу програму наочними засобами. Тобто користувач проектує інтерфейс вводу/виводу не створенням програмного коду, а шляхом розміщення компонентів вікна майбутньої програми на формі. Тому з урахуванням цього набагато спрощується процес проектування інтерфейсу програми, завдяки чому програміст має більше часу для розробки ефективного алгоритму.

На даний час практично усі «класичні» мови програмування мають своїх відповідників у вигляді середовищ візуального програмування. Крім того, існують мови програмування, які створені виключно для роботи у візуальному середовищі і як правило базуються на «класичних» мовах програмування. Так наприклад продовженням Паскаля є середовище Delphi, продовженням Сі – середовище С++ Builder. Крім того, на основи концепції мови Сі були створені мови Java, C# (Сі Шарп) Очевидно, що програми написані на класичних і сучасних мовах програмування є сумісними знизу вверх, тобто програма, написана на мові Сі повинна коректно запускатись у компіляторі С++ Builder. Хоча це стосується усіх операторів, крім функцій керування екраном, а також ведення/виведення інформації на екран, оскільки поняття консолі або екрану тут відсутнє і замінене формами.

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

Інтерфейс середовища С++ Bulider практично нічим не відрізняється від інтерфейсу середовища Delphi, оскільки розробником обох програм є фірма Borland. Різниця полягає лише в тому, що у Delphi використовується синтаксис Паскаля, а у Білдері – мови Сі. Структура вікна С++ Builder версії 6 є наступною:

    Отже, як видно з малюнку, крім головного меню та панелі інструментів, вікно містить:

t палітру компонентів (детальніше у наступному питанні);

t вікно структури проекту (проект може складатись із кількох форм та файлів);

t  вікно форми (у якому користувач проектує інтерфейс своєї програми шляхом розміщення компонентів вікна)

t Редактор коду програми (куди вводиться програмний код для певної частини проекту, тобто форми або бібліотеки)

t Вікно властивостей об’єкта (яке відображає усі властивості активного у певний момент часу об’єкта).

Усі елементи середовища, крім головного меню можуть бути неактивними. Тому для їх відображення можна скористатись командами меню View або відповідними кнопками на панелі інструментів:

 



Для відображення вікна властивостей об’єкта використовується команда Object Inspector, для відображення структури проекту – команда Object Tree View, для відображення форм – команда Forms, а для відображення коду програми – команда Units.


Основні команди, які слід використовувати під час запуску програми зосереджені у меню Project та Run, а їх призначення відповідає відповідним командам середовища Visual C ++:


Найбільш потрібними командами меню Project є команди Compile Unit (компіляція виділеного фрагмента об’єкта), Make Project (створення виконавчого файлу) та Build Project (компіляція проекту та створення виконавчого файлу). Очевидно, що під час створення проекту найбільш частіше використовується третя команда, яка дозволяє виконати повну компіляцію програми без її запуску.

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

У меню Run призначення команд таке ж саме, як і в інших середовищах програмування (в тому числі і у Visual C ++). Але очевидно, що найпопулярнішими командами тут є Run, Run to Cursor, а також Step Over та Step Into.

Головним компонентом систем візуального програмування є форма, тобто компонент, який є прототипом вікна Windows, і на якому можна розмістити усі можливі елементи вікна.

Усі елементи вікна, які можна розмістити на формі, розташовані у палітрі компонентів. Через їх велику кількість, вони поділені на групи, головними з яких є Standard  та Additional. Перша група включає компоненти, які використовуються найчастіше:

1. Label – для відображення текстової інформації, яка не змінюється користувачем.

2. Edit – для введення текстових даних у вигляді одного рядка символів.

3. Мемо - для введення текстових даних, які складаються з кількох рядків.

4. Button – для задання кнопок.

5. CheckBox – для включення або виключення певної опції програми («галочка»);

6. RadioButton – для переключення між певними опціями програми;

7. ListBox – для відображення інформації у вигляді списку, усі рядки якого можуть одразу відображатись на екрані.

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

9. GroupBox – для створення групи об'єктів, які беруться в рамку і мають певну назву (аналог фрейму в HTML)

10. RadioGroup – для створення групи перемикачів. Такий компонент може використовуватись тоді, коли на одній формі розміщуються кілька груп перемикачів. Якщо його не використати, то активним у певний момент часу може бути лише один перемикач, а не кілька.

 

Компоненти групи Additional надають певні додаткові можливості щодо створення форми, а також включають певні подібні на попередню групу компоненти, але модифіковані для використання у певних специфічних ситуаціях.

1. BitBtn –використовується для створення керуючих кнопок (наприклад кнопки відміни, або підтвердження тощо). Це дозволяє паралельно з назвою кнопки відображати певні графічні картинки. Крім того, натискання цих кнопок може проводитись автоматично після натиснення певних клавіш клавіатури (кнопка підтвердження- клавішею Enter, а кнопка в ідміни – клавішею Esc).

2. SpeedButton –кнопка, на якій знаходиться картинка, що може змінювати свій вигляд під час роботи програми.

3. М askEdit - для введення текстових даних, які маскуються на екрані зірочками чи іншими символами (наприклад пароля).

4. Image – для відображення картинок.

5. Shape – для побудови простих геометричних фігур (наприклад прямокутника або лінії)

6. CheckListBox – для відображення списку, у якому елементи відображені як опції.

7.  StaticText – використовується як і Label  для відображення інформації на формах, але на відміну від класичної мітки на цей компонент неможливо передати фокус (тобто цей компонент відображає текст, але активним він не може бути).

8. LabeledEdit – текстове поле з надписом. Підходить для швидкого створення форми, але можливості щодо керування надписом тут є більш обмежені, ніж у компонента Label.

Усі ці компоненти є частиною форм, тому з точки зору об’єктно-орієнтованого програмування вони є дочірніми об’єктами форми. Це означає, що багато властивостей форм успадковується цими компонентами. Тому розглянемо ті властивості, які притаманні більшості компонентів:

t Name – назва компонента. Вона буде використовуватись під час звертання до компонента у тексті програми. Очевидно, що на формі не може бути однакових компонентів (виняток становить лише їх масив, коли групу компонентів можна задати однаковим іменем) Але на відміну від середовища Visual Basic цей массив може створюватись лише программно, а не шляхом простого розміщення компонентів на формі.

t Caption – задає підпис компонента. Наприклад для міток цей текст буде відображений на формі.

t Alignment – задає порядок розташування тексту всередині компонента (по лівому, правому краю, по центру тощо).

t Color – задає колір компонента.

t Enabled – дозволяє зробити компонент неактивним. Це означає, що компонент буде відображатись на екрані, але у неактивному (затіненому) вигляді, і усі події щодо нього стануть неможливими.

t Font – задає шрифт компонента. Завдяки цьому можна проводити форматування надписів (міняти розмір шрифта, його тип, робити жирним тощо)

t Height , Width – задає розміри об’єкта (висоту і ширину). Такі властивості зручніше змінювати мишкою, а їхні назви як правило використовуються для програмного керування розмірами компонентів.

t TabOrder – дуже важлива властивість, яка задає порядок передачі фокуса між компонентами. Вона задається у вигляді цілого числа, і активність компонентів на формі при натисканні кнопки Та b змінюється відповідно до порядку цифр цієї властивості. Зворотня зміна активності проводиться шляхом натискання комбінації Shift + Tab.

t Text – дозволяє змінювати текст, що відображається всередині компонента.

t Visible – дозволяє тимчасово зробити елемент невидимим без видалення його з форми.
Оскільки компоненти є дочірніми об’єктами форм, то звертання до них відбувається шляхом використання операції - > (аналогічно проводиться звертання до властивостей компонентів), а

Form 1 -> Button 1 -> Visible = false ;

Ще однією важливою властивістю, і водночас проблемою під час роботи з С++ Builder є те, що компілятор розрізняє великі і малі букви. Тому усі назви компонентів повинні починатись з великої букви. Якщо ж назва складається з кількох слів (наприклад TabOrder) і які склеєні в одній назві, то великою може бути й інша буква у назві компонента. Тому якщо програміст зробить хоча б одну помилку у таких назвах, то компілятор виведе повідомлення про помилку ( Undefined Symbol).

Ще одними важливими властивостями компонентів є події з ними. Цими подіями можуть бути натиснення миші Click, переміщення DragDrop, зміни Change завантаження тощо. Реакція на ці події оформляються у вигляді спеціальних функцій, в яких описується уся логіка програми згідно правил структурного програмування, або ж програмно змінюються властивості компоненти форми:

void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{

 bitBtn1-> Enabled = false;

}

При цьому заголовки таких функцій формуються автоматично – для цього слід у вікні властивостей об’єкта перейти на закладку Events, і двічі натиснути лівою кнопкою миші на певній події:

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

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

Після запуску середовища С++ Builder буде відкрита початкова форма проекту Form 1, у якій буде відображено заготовку такого коду.

//---------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //----------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner)    : TForm(Owner) {   } //-------------------------------------------------------------------

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

2. Успадкування та поліморфізм.

В основі класів лежать три фундаментальні принципи - інкапсуляція, успадкування і поліморфізм.

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

Методами класу є функції, які визначені для плів чи зовнішніх змінних.

Специфікатри доступу описують так:

private – доступність лише методів класу.

protected – доступність лише для методів класу та методів похідних класів.

public – доступність для будь-якої зовнішньої функції.

Принцип інкапсуляції використовувався в технології модульного програмування. У модулі в явній формі введена інкапсуляція шляхом поділу його на секції інтерфейсу і реалізації.

В об'єктно-орієнтованому програмуванні принцип інкапсуляції використовується для ізоляції класу від інших частин програми, щоб зробити його самодостатнім для вирішення конкретного завдання. Наприклад, клас TForm в середовищі Delphi містить (інкапсулює в собі) все необхідне для створення Windows-вікна, клас ТMemo представляє собою потужний текстовий редактор, клас TTimer забезпечує роботу програми з таймером.

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

Оголошення класу синтаксично є подібним до оголошення структури. Загальні формати оголошення класу мають такий вигляд:

Варіант 1 class ім'я_класу {

private:

закриті дані та функції класу

public:

відкриті дані та функції класу

} перелік_об'єктів_класy;






Варіант 2

 

class ім'я_класу {

private:

закриті дані та функції класу

public:

відкриті дані та функції класу

};

ім'я_класу перелік_об'єктів_класy;

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

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

Для визначення можливості доступу до елементів похідного класу керуються наступною таблицею:

Доступ у базовому класі Специфікатор доступу успадковування Доступ у похідному класі
public public public
private public Не доступний
protected public protected
public private private
Private private Не доступний
Protected private private

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

Принцип успадкування оперує з поняттями "предок - нащадок" і передбачає розширення набору властивостей нащадка за рахунок прийняття всіх властивостей предка.

Будь-який клас може бути породжений від іншого класу. Для цього при його оголошенні вказується ім'я класу-батька.

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

Усі класи в Object Pascal породжені від єдиного батька - класу TObject. Цей клас не має полів і властивостей, але містить у собі методи самого загального призначення, що забезпечують весь життєвий цикл будь-яких об'єктів - від їх створення до знищення. Тому програміст не може створити клас, який не був би дочірнім класом TObject. Наступні два оголошення ідентичні.

Принцип успадкування призводить до створення розгалуженого дерева класів. Кожен нащадок доповнює можливості свого батька новими і передає їх своїм нащадкам. Наприклад, клас TPersistent збагачує можливості свого батька TObject тим, що він вміє зберігати дані у файлі й отримувати їх з нього, в результаті це вміють робити і всі його нащадки. Клас TComponent, у свою чергу, вміє взаємодіяти із середовищем розробника і передає це вміння своїм нащадкам. TControl не тільки здатний працювати з файлами і середовищем розробника, але він ще вміє створювати та обслуговувати видимі на екрані зображення, а його нащадок TWinControl може створювати Windows-вікна тощо.

У Object Pascal можливо тільки так зване одиночне спадкування, але в реальному світі у нащадка два батьки, тому в ряді мов (наприклад, в C++) передбачений механізм множинного успадкування. Множинне успадкування більш логічне з точки зору моделювання реального світу, проте, воно ускладнює реалізацію мов програмування.

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


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 359; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.046 с.)
Главная | Случайная страница | Обратная связь