Чи можна розглядати методи інтерфейсу як абстрактні методи?


15

Я думав про це, і у мене були деякі сумніви.

Наприклад, коли я оголошу інтерфейс, наприклад:

public interface MyInterface
{
   public void method1();
   public void method2();
}

Чи можна вважати ці методи інтерфейсу абстрактними? Я маю на увазі те, що поняття абстрактного методу:

Абстрактний метод - це метод, який оголошується, але не містить реалізації.

Отже, чи можна вважати ці методи абстрактними? Вони не є "чистими" абстрактними методами, як я не використовую це abstractслово, але концептуально, схоже, є.

Що ви можете мені сказати про це?

Спасибі.


Напевно, найкраще на SO
billy.bob

5
@ billy.bob - я думаю, що це занадто абстрактно для переповнення стека. Тут немає конкретної проблеми кодування.
ChrisF

Це код Java?
Андрес Ф.

ні це не так. це просто приклад. питання не зосереджено на будь-яких мовах програмування.
rogcg

Відповіді:


14

Інтерфейс схожий на "чисто" абстрактний клас. Клас та всі його методи абстрактні. Абстрактний клас може мати реалізовані методи, але сам клас не може бути ініційований (корисний для успадкування та слідування DRY).

Для інтерфейсу, оскільки взагалі не існує жодної реалізації, вони корисні за своїм призначенням: контракт. Якщо ви реалізуєте інтерфейс, то ви повинні  реалізувати методи в інтерфейсі.

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

Причина, по якій вони є окремими, полягає в тому, що клас може реалізувати кілька інтерфейсів. Java та C # обмежують клас, властивий одному батьківському класу. Деякі мови дозволяють успадкувати з декількох класів, і ви могли виконати роботу інтерфейсу через "чисто" абстрактний клас. Але багаторазове успадкування має свої проблеми, а саме жахливу Діамантову проблему


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

Проблема з алмазами - надзвичайний парадокс.
rogcg

1
Я не згоден з тим, що "Інтерфейс - це як частина" чисто "абстрактного класу". Вони є двома різними типами будівельних блоків OO, тому вони насправді зовсім не схожі. Вони мають загальні риси, але в природі вони різного типу, більше схожі на чоловіків і жінок, наприклад :)
NoChance

5
@Emmand Kareem Я не згоден з "Інтерфейс - це як" чисто "абстрактна частина класу. Ось чому я написав це :-). Якщо у вас є якісь вагомі причини для вашої незгоди, будь ласка, опублікуйте, я хотів би почути
coder

Варто зазначити, що c # 8 також вводить концепцію реалізації інтерфейсу
Джон Ву

11

Тут я знайшов корисну відповідь: http://download.oracle.com/javase/tutorial/java/IandI/ab абстракт.html

Всі методи в інтерфейсі неявно абстрактні, тому абстрактний модифікатор не використовується з методами інтерфейсу (це може бути - це просто не потрібно).


1
Також зауважте, що абстрактний клас поширює ще один об’єкт. Інтерфейси не мають поняття про суперклас.

2
Також зауважте, що ви можете реалізувати декілька інтерфейсів, але ви можете успадковувати лише один клас, абстрактний чи ні.
NullUserException

@ ThorbjørnRavnAndersen: Інтерфейс може розширювати один або кілька інтерфейсів. Це не такі самі речі, як суперклас, але це рівень успадкування.
unholysampler

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

@unholysampler, що не є суперкласом - як я вже сказав.

4

Абстрактні заняття можуть мати абстрактні методи.

Інтерфейси можуть мати лише абстрактні методи.

method1()і method2()у вашому прикладі є абстрактні методи.


-1

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


8
Абстрактні методи не можуть містити деталі реалізації. Абстрактні заняття можуть.
Метт H

Я знаю різницю між методом і класом - але я не можу зрозуміти, що ти робиш?
billy.bob

У вашій відповіді зазначено, що абстрактні методи можуть містити деталі реалізації - вони не можуть. Просто помилка друку?
Метт H

1
Я виправив друкарську помилку.
Martijn Verburg

1
@ billy.bob, хоча це питання стосується методу абстракції.
SoylentGray

-2

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


-3

Інтерфейсні класи не мають абстрактних методів. У них взагалі немає ніяких методів. Вони просто мають перелік методів, які повинен був би застосувати інший клас, щоб відповідати інтерфейсу. У вашому прикладі немає методу method1 і методу method2, поки хтось не додасть ці методи до класу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.