Абстрактний клас та інтерфейс в C#

Привіт, друзі! Якщо ви читали мою попередню статтю, то ми вже розглядали одну з важливих тем в ООП - Поліморфізм (Polymorphism). Сьогодні ж поговоримо про абстрактні класи (Abstract Class) та інтерфейси (Interface).

Почнемо з абстрактного класу:

pic

Що таке Abstract Class?

У розробці програмного забезпечення іноді виникає потреба в тому, щоб визначити спільні характеристики та поведінку для різних класів. У таких випадках на допомогу приходить abstract class (абстрактний клас). Абстрактний клас може містити як завершені (з тілом) так і незавершені (без тіла) методи. Абстрактні класи не можуть використовуватись самостійно; вони служать основою для інших класів. Таким чином, за допомогою абстрактного класу ми визначаємо спільну поведінку, надаючи підкласам можливість заповнити деталі, характерні для них. Коротше кажучи, Abstract Class ставить за мету створити базовий клас для класів, що мають спільні властивості.

Тепер давайте розглянемо приклад, щоб краще зрозуміти це:

pic

Як бачите, ми визначили абстрактний клас. Для того, щоб оголосити абстрактний клас, потрібно додати ключове слово abstract перед словом class.

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

Оскільки у кожної тварини є звук, ми використали метод speak() як базовий метод, і тепер кожна тварина, що наслідує цей абстрактний клас, може реалізувати метод speak() відповідно до свого власного звуку.

Методи, позначені ключовим словом abstract в абстрактних класах, не мають тіла, і клас, який їх наслідує, повинен заповнити це тіло. Проте, для звичайних методів ми можемо написати метод з тілом (як це зроблено для методів speak() та sleep()).

Також, змінні, позначені як абстрактні, можуть мати доступні модифікатори public або protected, але не можуть мати інші модифікатори доступу.

Важливо! Абстрактні класи не підтримують множинне наслідування!!!

pic

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

Не можна створити об'єкт абстрактного класу!!!

Неможливо створити об'єкт абстрактного класу, але можна створити його посилання!

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

pic

Оскільки клас Animal є абстрактним, ми не можемо створити об'єкт animal1. Однак, оскільки animal2 є посиланням, це дозволено. Крім того, метод sleep() визначений як static, тому ми можемо звертатися до нього без створення об'єкта, через сам клас.

У випадку, коли static не використовується, до змінних абстрактного класу можна звертатися через поліморфізм (Polymorphism), як це показано в наступному прикладі:

pic

Тут ми прибрали static із методу sleep() в класі Animal.
Припустимо, ми хочемо отримати доступ до цього методу, як же ми це зробимо? Оскільки не можемо створити об'єкт абстрактного класу (Abstract Class), а він не визначений як static, доступ через сам клас неможливий. Тому використаємо поліморфізм (Polymorphism).

pic

Ми створили об'єкт cat класу Cat через посилання на клас Animal і через цей об'єкт звернулися до методу sleep() абстрактного класу Animal.

ПРИМІТКА!!!

Не можна використовувати static для методів або властивостей, визначених за допомогою abstract keyword!

У абстрактних класах не можна використовувати field, виникне помилка; потрібно використовувати property!

Також абстрактні класи не можна позначати як Sealed!

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

pic

Ось тут конструктор без параметрів, тому клас Cat, успадковуючи Animal, не зобов'язаний використовувати конструктор.

pic

А ось тут видно, що компілятор підкреслив клас Cat і зажадав використання конструктора, ось як він виглядає:

pic

Коли створюється об'єкт класу Cat, спочатку викликається конструктор класу Animal, а потім — конструктор класу Cat.

Що таке Interface?

Інтерфейс (Interface) визначає шаблон поведінки для класів і залишає реалізацію цієї поведінки самим класам. Давайте пояснимо на прикладі:

pic

Коли визначають інтерфейси, зазвичай додають префікс "I", щоб було видно, що це інтерфейс.

В інтерфейсах не може бути коду.

Всі елементи інтерфейсу є public, доступні модифікатори доступу не використовуються.

В інтерфейсах не використовуються field, а лише property.

В інтерфейсах неможливо використовувати constructor!

Класи, що успадковують абстрактні класи, повинні реалізовувати всі методи та змінні, визначені через abstract keyword. Клас, що успадковує інтерфейс, повинен реалізувати всі методи та властивості цього інтерфейсу!

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

Інтерфейс може наслідувати лише інший інтерфейс, але не може успадковувати класи, як показано у прикладі:

pic

Інтерфейс може наслідувати інший інтерфейс

pic

Це викликає помилку

ПРИМІТКА: Інтерфейси також підтримують множинне успадкування

pic

Коли інтерфейс успадковує інший інтерфейс, він не зобов'язаний використовувати всі його властивості, але, як видно з прикладу, клас Person, успадковуючи інтерфейс ICreature, зобов'язаний використовувати всі властивості інтерфейсів, що успадковуються ICreature.

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

https://www.linkedin.com/in/erenctns/

[

erenctns - Огляд

Студент комп'ютерної інженерії. У erenctns є 9 репозиторіїв на GitHub. Слідуйте за їхнім кодом.

github.com

](https://github.com/erenctns?source=post_page-----63663986f7ad--------------------------------)

Перекладено з: Abstract Class And InterfaceWith C#

Leave a Reply

Your email address will not be published. Required fields are marked *