Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП (3 у.класи) оп.doc
Скачиваний:
1
Добавлен:
11.11.2019
Размер:
94.21 Кб
Скачать

Лекція 3:

Тема: Класи в ООП. Основні засоби розробки класів.

План:

  1. Класи, опис класів.

  2. Основні засоби розробки класів.

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

  4. Поліморфізм.

  5. Інкапсуляція

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

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

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

Об’єкт-змінна

Значення

методи

О б'єкт – абстракция Клас

Стан

Поведінка

Поля

Методи

Об’єкт-змінна

Значення

методи

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

У програмах використовуються змінні типу класу. Такі змінні прийнято називати об'єктами.

Приклад Опис класу (клас Вікно). Хай необхідно розробити клас, змінні якого використовуються для зображення на екрані кольорового прямокутника заданого кольору і розміру (мал. 2). Проектований клас повинен містити поля для збереження параметрів вікна: XI, Yl, X2, Y2 - координати верхнього лівого і нижнього правого кутів і Color - колір.

Х

A(x1,y1)

ай єдине повідомлення, що обробляється об'єктом, - «Намалювати вікно». Відповідно, клас повинен містити метод, що реалізовує процес малювання об'єкту. Поля об'єкту можна ініціалізувати при створенні Переменной-в (х2 у2) об'єкту,

кольор

B(x2,y2)

Мал. 2 Вид та параметри вікна на екрані

передавши йому повідомлення ініціалізації, що включає значення полів.

Отже, клас повинен містити метод ініціалізації.

Остаточно отримуємо клас, що має наступну структуру:

Клас Вікно:

поля X1,Y1,X2,Y2, Color

метод Ініціалізувати(аХ 1,aY I,aX2,aY2,aColor)

метод Зобразити

Кінець опису.

Створюючи об'єкти типу Вікно, ініціалізувавши їх відповідно до умови і посилаючи їм повідомлення «Намалювати вікно», отримаємо різні вікна на екрані, причому параметри цих вікон зберігатимуться в об'єктах.

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

Дія на об'єкт виконується за допомогою зміни його полів або виклику його методів. Доступ до полів і методів об'єкту здійснюється, за винятком спеціальних випадків, з вказівкою імені об'єкту (при цьому використовуються складені імена):

<ім'я об'єкту>.<имя поля>

або

<ім'я об'єкту>.<имя методу>.

Всі методи об'єкту обов'язково мають доступ до всіх полів свого об'єкту. У мовах програмування, що розглядаються далі, це досягається через неявну передачу в метод спеціального параметра - адреси області даних конкретного об'єкту (Self- в Паскалі і this - в C++). Таким чином, зменшується кількість параметрів, явно передаваних в метод.

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

Клас <ім'я класу>

інтерфейс

<оголошення полів і методів класу, до яких можливе звернення ззовні>

реалізація

<оголошення полів і методів класу, до яких неможливе звернення ззовні>

Кінець опису.

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

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

Мал. 3 Інтерфейс і реалізація класу

З іншого боку доступ до об'єкту регламентується і повинен виконуватися через спеціальний інтерфейс (мал. 3).

Як і будь-яка змінна програми, об'єкт повинен бути розміщений в пам'яті (створений) і видалений з пам'яті (знищений). Причому створення і знищення об'єктів виконується статично або динамічно.

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

Динамічне створення і знищення об'єктів виконується в процесі роботи програми спеціальними командами.

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

Прикла. Заховання реалізації класу (клас Файл - продовження прикладу). Відповідно до результатів об'єктної декомпозиції. Файл повинен реагувати на наступні повідомлення: «Відкрити», «Додати запис», «Знайти запис».

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

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

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

Метод Знайти також спочатку повинен перевіряти, чи відкритий файл. Якщо файл відкритий, метод виконує пошук інформації у файлі. Операції перевірки відкриття файлу виконуються в методах Додати і Знайти.

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

Остаточно для реалізації об'єкту Файл можна запропонувати клас наступної структури:

Клас Файл:

інтерфейс

конструктор Ініціалізувати;

метод Відкрити (ім'я файлу);

метод Додати (прізвище, телефон);

метод Знайти (прізвище);

деструкція Закрить_файл;

реалізація

поле Файлова_змінна;

поле Стан_файлу;

метод Перевірка_відкриття;

Кінець опису.

Після визначення структури класу повинні бути розроблені алгоритми методів і призначені типи полів і передаваних параметрів.

У програмі повинна бути використана змінна типу Файл. Оскільки файл в програмі використовується постійно, відповідну змінну краще визначати статично.

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

2. Основні засоби розробки класів

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

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

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

Приклад. Спадкоємство (клас Окно_меняющєє_цвет). Побудуємо на базі класу Вікно клас-нащадок, який може змінювати колір вікна на екрані. Для цього до батьківського класу досить додати метод Ізменіть_цвет:

Клас Окно_меняющєє_цвет - батько: клас Вікно:

метод Ізменіть_цвет(аСоlог);

Кінець опису.

Клас Окно_меняющєє_цвет містить всі поля батьківського класу і всі його методи. Додатково об'єкти типу Окно_меняющєє_цвет можуть міняти колір вікна на вказаний в повідомленні «Ізменіть_цвет» (мал. 3).

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

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

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

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

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

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

Розрізняють декілька термінів, пов'язаних з конкретними механізмами реалізації поліморфізму для різних випадків:

чистий поліморфізм - використовується для позначення того, що один код функції може по-різному інтерпретуватися залежно від типу аргументів; використовується в мовах високого рівня абстракції, наприклад, в мові LISP або SMALLTALK;

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

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

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

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

Об'єкти

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