Обєктно-орієнтованого програмування

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

Існує п'ять компонент ООП:

1 – об'єкт;

2 – повідомлення;

3 – клас;

4 – успадкування;

5 – метод.

Будь-яка об'єктно-орієнтована мова повинна мати властивості абстракції, інкапсуляції, успадкування й поліморфізму.

Об'єкт – це iнкапсульована абстракція, яка включає інформацію про стан і чітко визначену множину протоколу доступу (повідомлення, яке обробляє об'єкт).

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

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

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

Таким чином, об'єкти належать до окремих класів. Вони обробляють повідомлення відповідно до методів, заданих в описі класу, і мають змінні стану, визначені в цьому описі. Змінні стану можуть мати однакові чи різні значення в різних об'єктах (екземплярах класу).

Розглянемо основні поняття ООП відносно С++.

Клас – це новий тип даних, який вводиться за допомогою ключового слова class.

Об'єкт – це змiнна типу ClassName, де ClassName – ім'я раніше визначеного класу.

Змінні стану – це змінні, оголошені в описі класу. Називатимемо їх полями даних.

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

Метод – це визначення (реалізація) функції-члена класу.

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

Інкапсуляція – це об'єднання, закриття в "капсулі" певних конструкцій.

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

Потрібно розрізняти успадкування та контейнерні відношення. Якщо клас 1 має всі властивості класу 0 i, крім того, якісь додаткові, то в такому випадку виправдана ієрархічна структура (успадкування):

class1<-class0

Про контейнерне відношення говорять, якщо об'єкт класу class0 містить об'єкт класу class1, тобто одне з полів класу class0 має тип class1.

Поліморфізм – це здатність повідомлення викликати різні дії (реакції методів) на етапі виконання програми. Конкретна форма реакції на повідомлення визначається й пов'язується з об'єктом під час виконання програми (пізнє зв'язування). У С++ поліморфізм виявляється в підтримці таких механізмів:

a перевантаження функцій (усередині опису класу можна пере­вантажити функції);

a перевантаження операцій;

a віртуальні функції.

7.2. Від структур ANSI С до класів С++

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

struct Time {

int year;

int month;

int day;

int hour;

int minute; };

Time v;

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

void Display(Time*p)

{printf("year=%d month=%d day=%d hour=%d\

minute=%d \n",p->year,p->month,p->day,\

p->hour,p->minute);}

Функція Display семантично пов'язана зі структурою Time. Це наводить на думку пов'язати функцію зі структурою синтаксично. У С++ (на відміну від ANSI C) є така можливість – функцію можна записувати як поле структури. Тоді попередній фрагмент програми можна переписати так:

struct Time {

int year;

int month;

int day;

int hour;

int minute;

Void Display (void)

{printf("year=%d month=%d day=%d hour=%d\

minute=%d \n",p->year,p->month,p->day,\

p->hour,p->minute);} };

Можна записати функцію-член структури, визначивши її за межами формального опису з використанням операції розширення області видимості:

struct Time {

int year;

int month;

int day;

int hour;

int minute;

void Display (void);};


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: