Різниця між абстрактним класом та інтерфейсом у C #

Абстрактний клас дуже схожий на інтерфейс, але концепція трохи заплутана для початківців OOP. Концептуально абстрактний клас виглядає так само, як інтерфейс, звичайно, без будь-якої реалізації, проте вони мають свою справедливу частку відмінностей. Хоча абстрактний клас може бути частково або повністю реалізований, інтерфейс повинен бути реалізований повністю. Ну, найбільш помітна різниця між ними полягає в тому, що абстрактний клас може мати реалізацію за замовчуванням, тоді як інтерфейс - це лише визначення методів, що містить лише декларації учасника. Давайте обговоримо теоретичні аспекти обох детально.

Що таке абстрактний клас?

Абстрактний клас - це особливий тип класу, який виступає базою інших класів і не може бути ініційований. Логіка реалізації абстрактного класу забезпечується його похідними класами. Щоб зробити клас абстрактним, використовується "абстрактний" модифікатор, який означає, що деяка відсутність реалізації повинна бути реалізована в похідному від нього класі. Він містить як абстрактних, так і не абстрактних членів. Абстрактний клас призначений для забезпечення базової функціональності, яка може бути надано спільною та переопрацьованою кількома похідними класами. Корисно уникати будь-якого дублювання коду. Вони дуже схожі на інтерфейси, але з додатковою функціональністю.

Що таке інтерфейс?

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

Абстрактний клас проти інтерфейсу: різниця між абстрактним класом та інтерфейсом у C #

  1. Множинне спадкування - Клас може використовувати лише один абстрактний клас, отже, множинне успадкування не підтримується. Інтерфейс, з іншого боку, може підтримувати багатократне успадкування, а це означає, що клас може успадковувати будь-яку кількість спадків.
  2. Визначення  з Анотація класу та інтерфейсу в C #- Абстрактний клас - це особливий тип класу, який може містити визначення без реалізації. Логіка реалізації забезпечується похідними класами. Він може мати як абстрактні, так і не абстрактні методи. Інтерфейс, з іншого боку, - це лише шаблон, який нічого не може зробити. Технічно це просто порожня оболонка.
  3. Впровадження - Абстрактний клас може містити як визначення, так і його реалізацію. Це незавершений клас, який неможливо встановити. Інтерфейс може мати лише підпис функціональності без будь-якого коду.
  4.  Модифікатори доступу - Абстрактний клас може мати декілька модифікаторів доступу, таких як підрозділи, функції, властивості тощо, тоді як в інтерфейсі заборонено мати модифікатори доступу, і всі методи повинні неявно визначатися як загальнодоступні.
  5. Однорідність - Абстрактний клас використовується для реалізацій одного типу, поведінки та статусу, тоді як інтерфейс використовується для реалізацій, які мають спільний доступ лише до підписів методів.
  6. Декларація - Абстрактний клас діє як базовий клас для всіх інших класів, тому він може оголошувати або використовувати будь-яку змінну, в той час як інтерфейс заборонений для оголошення будь-яких змінних.
  7. Декларація конструктора - Хоча абстрактний клас може мати декларацію конструктора, інтерфейс не може мати декларацію конструктора.
  8. Основні проти периферійних - Абстрактний клас використовується для визначення основної ідентичності класу і може використовуватися для об'єктів одного типу даних. Інтерфейс, з іншого боку, використовується для визначення периферійних можливостей класу.
  9. Жорсткий проти доповнення - Абстрактний клас є більш гнучким з точки зору функціональності, принаймні з точки зору розробника, тоді як інтерфейс більш жорсткий.

Абстрактний клас проти інтерфейсу: форма таблиці

Анотація класу

Інтерфейс

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

Підсумок

Чим відрізняється абстрактний клас від інтерфейсу? Це, мабуть, одне з найпоширеніших питань, яке задають у будь-якому технічному інтерв'ю. Ви, ймовірно, знайдете безліч інформації про абстрактні класи та інтерфейси в будь-якому навчальному посібнику C #, проте розуміння різниці між цими двома є досить важкою частиною. Ви можете консолідувати всю інформацію, яку ви можете знайти, і все ще не можете її отримати. Ну, концептуально обидва є найважливішими термінами в програмуванні і цілком однакові, однак вони сильно відрізняються з точки зору функціональності. Хоча абстрактний клас - це особливий тип класу, який виступає базою для інших класів, інтерфейс, з іншого боку, є лише порожньою оболонкою з лише деклараціями членів.