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

Автор: Laura McKinney
Дата Створення: 1 Квітень 2021
Дата Оновлення: 13 Травень 2024
Anonim
Різниця між інтерфейсом та абстрактним класом у Java & C # - Технологія
Різниця між інтерфейсом та абстрактним класом у Java & C # - Технологія

Зміст


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

  1. Порівняльна діаграма
  2. Визначення
  3. Ключові відмінності
  4. Висновок

Порівняльна діаграма

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


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

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

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


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

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

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

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

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

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

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

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

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

Інтерфейс в C # майже схожий на інтерфейс на Java, за винятком:

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

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

class class_name: interface_name {// class-body}

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

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

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

абстрактний клас class_name {абстрактний метод_ ім'я1 (); абстрактний method_name2 (); : return_type method_name3 (parameter_list) {// конкретний метод} return_type method_name4 (parameter_list) {// конкретний метод}};

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

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

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

Висновок:

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