Могу ли я рассматривать интерфейсные методы как абстрактные методы?


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
Я не согласен с тем, что «интерфейс похож на« чисто »абстрактный класс». Это 2 разных типа ОО «строительных блоков», поэтому они на самом деле совсем не похожи. У них есть некоторые общие черты, но по своей природе они бывают разных типов, больше похожи, например, на мужчин и женщин :)
NoChance,

5
@Emmand Kareem Я не согласен с частью «Интерфейс похож на« чисто »абстрактный класс». Вот почему я написал это :-). Если у вас есть веские причины для вашего несогласия, пожалуйста, напишите, я хотел бы услышать
кодер

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

11

Я нашел полезный ответ здесь: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Все методы в интерфейсе неявно абстрактны, поэтому модификатор abstract не используется с методами интерфейса (это может быть - это просто не нужно).


1
Также обратите внимание, что абстрактный класс расширяет еще один объект. Интерфейсы не имеют понятия о суперклассе.

2
Также обратите внимание, что вы можете реализовать несколько интерфейсов, но вы можете наследовать только от одного класса, абстрактного или нет.
NullUserException

@ ThorbjørnRavnAndersen: интерфейс может расширять один или несколько интерфейсов. Это не то же самое, что суперкласс, но это уровень наследования.
unholysampler

Вы можете реализовать несколько интерфейсов. Похоже, концепция множественного наследования, но не совсем так.
rogcg

@unholysampler, который не суперкласс - как я уже сказал.

4

Абстрактные классы могут иметь абстрактные методы.

Интерфейсы могут иметь только абстрактные методы.

method1()и method2()в вашем примере это абстрактные методы.


-1

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


8
Абстрактные методы не могут содержать детали реализации. Абстрактные занятия могут.
Мэтт Х

Я знаю разницу между методом и классом - но я не могу понять, что вы делаете?
billy.bob

В вашем ответе говорится, что абстрактные методы могут содержать детали реализации, а не могут. Просто опечатка?
Мэтт Х

1
Я исправил опечатку.
Мартейн Вербург

1
@ billy.bob этот вопрос касается метода abstact.
SoylentGray

-2

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


-3

Интерфейсные классы не имеют абстрактных методов. У них нет никаких методов вообще. У них просто есть список методов, которые другой класс должен реализовать, чтобы соответствовать интерфейсу. В вашем примере нет метода method1 и метода method2, пока кто-то не добавит эти методы в класс.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.