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


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.