НОУ ІНТУІТ, Лекція, Ієрархія класів

Багаторівнева ієрархія

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

інтуіт

Змінні базового класу та похідного класу

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

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

Віртуальні методи

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

Абстрактні методи та класи

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

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

Якщо клас містить один або кілька абстрактних класів, його також потрібно оголосити як абстрактний, використовуючи специфікатор abstract перед class . Оскільки абстрактний клас повністю не реалізований, неможливо створити екземпляр класу за допомогою операції new . Наприклад, якщо клас Demo визначений як абстрактний, то спроба створити екземпляр класу Demo спричинить помилку:

Однак, можна створити масив посилань, використовуючи цей же абстрактний клас:

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

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

Заборона наслідування

У C# є ключове слово sealed, що дозволяє описати клас, від якого заборонено спадкування. Наприклад: