Рекомендуємо, 2024

Вибір Редакції

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

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

Діаграма порівняння

Основа для порівнянняІнтерфейсАнотація класу
ОсновнийКоли ви тільки знаєте вимоги не про його реалізацію, ви використовуєте "Інтерфейс".Коли ви частково знаєте про реалізації, ви використовуєте "Абстрактні класи".
МетодиІнтерфейс містить лише абстрактні методи.Абстрактний клас містить абстрактні методи, а також конкретні методи.
Модифікатор методів доступуМетоди інтерфейсу завжди "Public" і "Abstract", навіть якщо ми не оголошуємо. Отже, це можна сказати як 100%, чистий абстрактний клас.Не обов'язково, що метод в абстрактному класі буде публічним і абстрактним. Він також може мати конкретні методи.
Обмежений модифікатор методівМетод інтерфейсу не може бути оголошений наступними модифікаторами:
Загальнодоступний: приватний і захищений
Анотація: фінальний, статичний, синхронізований, рідний, рок.
Немає обмежень на модифікатори змінних абстрактного класу.
Модифікатор доступу до зміннихМодифікатор Acess, дозволений для змінних інтерфейсу, є загальнодоступними, статичними та остаточними, чи ми декларуємо чи ні.Змінні в абстрактному класі не повинні бути публічними, статичними, кінцевими.
Обмежені модифікатори для зміннихІнтерфейсні змінні не можуть бути оголошені як приватні, захищені, перехідні, мінливі.Не існує обмежень на модифікатори абстрактних змінних класу.
Ініціалізація зміннихЗмінні інтерфейси повинні бути ініціалізовані під час його декларування.Не обов'язково, щоб абстрактні змінні класу повинні бути ініціалізовані під час його декларування.
Примірник і статичні блокиВсередині інтерфейсу не можна оголосити примірник або статичний блок.Абстрактний клас допускає примірник або статичний блок всередині нього.
КонструкториНе можна оголосити конструктор всередині інтерфейсу.Ви можете оголосити конструктор всередині абстрактного класу.

Визначення інтерфейсу

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

Інтерфейс - це чистий абстрактний клас. Ключове слово, яке використовується для створення інтерфейсу, - це "інтерфейс". Як і весь метод всередині інтерфейсу повністю абстрактний. Інтерфейс визначає тільки те, що клас повинен робити, але він не визначає, як він це робить. Просто тому, що весь метод, оголошений усередині інтерфейсу, є абстрактним, для інтерфейсу не створено жодного екземпляра. Загальна форма "інтерфейсу" в java:

 інтерфейс access_specifier interface_name {return-type method-name1 (список параметрів); return-type method-name2 (список параметрів); тип final-varname1 = значення; тип final-varname2 = значення; // ... повернути тип методу-nameN (список параметрів); тип final-varnameN = значення; } 

Специфікатор доступу оголошується загальнодоступним, тому що класи повинні реалізовувати інтерфейс.

У C ++ ми не маємо поняття “Interface”. Але, Java і C # визначають інтерфейс дуже добре.

Інтерфейс в Java:

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

Загальна форма реалізації інтерфейсу в Java:

 class class_name реалізує Interface_name {// class-body} 

Для успадкування інтерфейсу клас використовує ключове слово "реалізує", і клас реалізує весь метод, оголошений успадкованим інтерфейсом.

Інтерфейс у C #:

Інтерфейс у C # майже подібний до інтерфейсу в Java, окрім:

  • Інтерфейс у C # не оголошує змінних.
  • Ім'я інтерфейсу має префікс з великим I і успадковується двокрапкою (:).

Загальна форма реалізації інтерфейсу в C #:

 class class_name: interface_name {// class-body} 

Визначення абстрактного класу

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

Анотація класу може також містити конкретні методи, які можуть бути використані похідним класом як є. Але не можна оголосити абстрактний конструктор або абстрактний статичний метод всередині абстрактного класу. Загальний вигляд абстрактного класу в Java полягає в наступному:

 абстрактний клас class_name {abstract method_name1 (); abstract method_name2 (); : return_type method_name3 (parameter_list) {// конкретний метод} return_type method_name4 (parameter_list) {// конкретний метод}}; 

Концепція абстрактного класу подібна в Java і C #. Абстрактний клас трохи відрізняється в C ++.

У C ++, якщо клас принаймні має одну віртуальну функцію, клас стає абстрактним класом. Замість ключового слова "абстрактно" ключове слово "віртуальний" використовується для оголошення абстрактного методу.

Ключові відмінності між інтерфейсом і абстрактним класом в Java & C #

  1. Коли ви маєте знання “що потрібно”, але не “як це буде здійснено”, то інтерфейс повинен бути використаний. З іншого боку, якщо ви знаєте, що потрібно і частково знаєте, як вона буде реалізована, то використовуйте абстрактний клас.
  2. Інтерфейс має всі свої абстрактні методи, але абстрактний клас має деякі абстрактні методи і деякі конкретні методи.
  3. Методи всередині інтерфейсу є публічними і абстрактними, тому його також називають чистим абстрактним класом. З іншого боку, методи всередині абстракції не обмежуються лише публічними та абстрактними.
  4. Метод інтерфейсу ніколи не може бути приватним, захищеним, кінцевим, статичним, синхронізованим, нативним або жорстким. З іншого боку, не існує обмежень на методи абстрактного класу.
  5. Змінні в інтерфейсі є публічними і остаточними, чи ми їх декларуємо, чи ні, тоді як немає такого обмеження на змінні абстрактного класу, які будуть публічними і остаточними.
  6. Змінні в інтерфейсі ніколи не можуть бути приватними, перехідними або волатильними, тоді як не існує обмежень на змінні в абстрактному класі.
  7. Змінна інтерфейсу повинна бути ініціалізована під час оголошення. З іншого боку, змінні в абстрактному класі можуть бути ініціалізовані в будь-який час.
  8. Всередині інтерфейсу екземпляр або статичний блок не можуть бути оголошені, але ви можете оголосити екземпляр або статичний блок всередині абстрактного класу.
  9. Ви не можете визначити конструктор в інтерфейсі, тоді як ви можете визначити конструктор всередині абстрактного класу.

Висновок:

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

Top