МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів Контакти
Тлумачний словник |
|
|||||||
Абстрактні класиРозглянемо приклад з попереднього параграфа. Оголосили базовий клас Іtem, який представляє загальні властивості всіх одиниць зберігання в бібліотеці. Але чи існують об'єкти класу Item? Тобто чи існує насправді "одиниця зберігання" сама по собі. Звичайно, кожна книга (клас Book), журнал (клас Magazin) і т.д. належать і до класу Іtem, оскільки вони успадковані з нього, проте об'єкт самого базового класу навряд чи має сенс. Базовий клас ‑ це деяке абстрактне поняття, що описує загальні властивості інших, конкретних об'єктів. Ряд методів базового класу не можуть бути реалізовані в ньому, а повинні бути реалізовані в породжених класах. Реалізація методу Name в базовому класі досить умовна, вона не має особливого сенсу. Було б набагато логічніше взагалі не реалізовувати цей метод в базовому класі, а залишити його на відповідальності похідних класів. З другого боку нам важливий факт наявності методу Name у всіх похідних класах і те, що цей метод віртуальний. Саме тому ми можемо працювати з вказівниками (або посиланнями) на об'єкти базового класу не знаючи точно, на який саме з похідних класів цей вказівник вказує. Віртуальний механізм під час виконання програми сам розбереться і викличе потрібну реалізацію методу Name. Така ситуація складається досить часто в об'єктно-орієнтованому програмуванні. (Пригадайте приклад з різними формами в графічному редакторі. Малювання якоїсь узагальненої форми неможливе.) В подібних випадках використовується механізм абстрактних класів. Запишемо базовий клас Іtem трохи по-іншому:
class Item { public: virtual String Name() const = 0; };
Тепер визначено метод Name як чисто віртуальний. Клас, у якого є хоча б один чисто віртуальний метод, називається абстрактним. Те, що метод оголошений чисто віртуальним, вимагає, щоб цей метод зобов'язаний бути визначений у всіх класах, похідних від Іtem. Наявність чисто віртуального методу забороняє створення об'єкту типу Іtem. В програмі можна використовувати вказівники або посилання на тип Item. Записи:
Item it; Item* itptr = new Item;
не дозволені, компілятор повідомить про помилку. Проте цілком можна записати:
Book b; Item* itptr = &b; Item& itref = b;
Відзначимо, що визначивши чисто віртуальний метод в класі Book, в наступному рівні спадкування його вже не обов'язково перевизначати (в класах, похідних з Book). Якщо з яких-небудь причин в похідному класі чисто віртуальний метод не визначений, то цей клас теж буде абстрактним і будь-які спроби створити об'єкт даного класу викликатимуть помилку. Таким чином, забути визначити чисто віртуальний метод просто неможливо. Абстрактний базовий клас нав'язує певний інтерфейс всім похідним від нього класам. Власне в цьому і полягає головне призначення абстрактних класів ‑ у визначенні інтерфейсу для всієї ієрархії класів. Зрозуміло, це не означає, що в абстрактному класі не може бути певних методів або атрибутів. Взагалі кажучи, клас можна зробити абстрактним, навіть якщо всі його методи визначені. Іноді це необхідне зробити для того, щоб бути упевненим в тому, що об'єкт даного класу не буде ніколи створений. Можна визначити один з методів як чисто віртуальний, але проте визначити його реалізацію. Звичайно для цих цілей вибирається деструктор:
class А { public: virtual ~A() = 0; }; A :: ~A() { . . . }
Клас A - абстрактний, і об'єкт типу А створити неможливо. Проте деструктор його визначений і буде викликаний при знищенні об'єктів похідних класів.
Читайте також:
|
||||||||
|