it-swarm.com.ru

в чем преимущество интерфейса перед абстрактными классами?

Абстрактный класс имеет как конкретную, так и абстрактную функцию. В интерфейсе есть только абстрактные функции.

Переопределение возможно в обоих. Это

В чем в реальном времени преимущество одного над другим?

16
zod

Интерфейсы предназначены для тех случаев, когда вы хотите сказать: «Мне все равно, как вы это делаете, но вот что вам нужно сделать».

Абстрактные классы предназначены для тех случаев, когда вы хотите сказать: «Я знаю, что вы должны делать, и я знаю, как вы должны это делать в некоторых/многих случаях».

Абстрактные классы имеют ряд серьезных недостатков. Например:

class House {

}

class Boat {

}

class HouseBoat extends /* Uh oh!! */ {
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter
}

Вы можете пройти через интерфейс:

interface Liveable {

}

interface Floatable {

}

class HouseBoat implements Liveable, Floatable {

}

Теперь абстрактные классы также очень полезны. Например, рассмотрим класс AbstractCollection. Он определяет поведение по умолчанию для очень распространенных методов для всех коллекций, таких как isEmpty() и contains(Object). Вы можете переопределить это поведение, если хотите, но ... действительно ли поведение для определения, является ли коллекция пустым, действительно изменится? Обычно это будет size == 0.

И поскольку он не будет часто меняться, стоит ли разработчику время внедрять этот метод каждый ... раз ... раз ... для каждого метода в этой категории "решенных"? Не говоря уже о том, когда вам нужно внести в него изменения, у вас будет дублирование кода и пропущенные ошибки, если вам придется внедрять его везде.

38
corsiKa

Интерфейсы полезны, потому что Java не имеет множественного наследования (но вы можете реализовать столько интерфейсов, сколько захотите).

Абстрактные классы полезны, когда вам нужно конкретное поведение базового класса.

16
Oliver Charlesworth

Факты

  1. Java не поддерживает множественное наследование
  2. Несколько интерфейсов могут быть реализованы
  3. Несколько методов в абстрактном классе могут быть реализованы

Эти факты могут быть использованы для наклона преимущества в пользу интерфейсов или абстрактных классов.

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

2
Arunraj Nair

В OOP (в основном не зависит от конкретного языка) абстрактные классы являются механизмом повторного использования для иерархии классов для поведения и структуры, которая сама по себе не завершена ... Интерфейсы - это механизм для спецификации требований к модуль (например, класс) независимо от конкретной реализации Все остальные отличия являются техническими деталями, важно другое использование.

1
Gabriel Ščerbák

Класс может реализовывать несколько интерфейсов, тогда как он может расширять только один класс (абстрактный или конкретный), поскольку Java не поддерживает множественное наследование.

1
ChrisJ

Основное преимущество интерфейса перед абстрактным классом состоит в том, чтобы преодолеть возникновение проблемы diamond .__ и достичь множественного наследования . В Java нет решения для проблемы diamond с использованием классов. По этой причине множественное наследование является блочным с использованием классов в Java . Поэтому для достижения множественного наследования мы используем интерфейс.

0
ANKIT JAIN

Вы не переопределяете интерфейс. Вы реализуете это.

Написание интерфейса дает разработчикам возможность реализовать ваш интерфейс, а также другие интерфейсы в дополнение к наследованию от базового класса. 

Абстрактные классы могут быть частично или полностью реализованы. Обозначение абстрактного класса просто предотвращает создание экземпляра объекта этого типа.

0
Kal
class Animal
{ void move(){} }

class Bird
{ void move(){fly} }

class Fish
{ void move(){swim} }

Теперь, если класс Animal является абстрактным классом, как

Animal a; 

a= new Bird(); or a = new Fish()

Здесь абстракция работает хорошо, но если есть 100 объектов, таких как Animal a[100]

Вы не можете написать new Bird().move или new Fish().move 100 раз 

Используйте интерфейс и напишите a[i].move. Он будет различаться как птица или рыба, и будет вызвана функция move()

Во-вторых, он поддерживает множественное наследование, поскольку класс A может реализовывать столько же интерфейсов.

0
Jay

Метод без какой-либо реализации является абстрактным методом, когда класс содержит один или несколько абстрактных методов, он должен быть объявлен как абстрактный класс. 

-Интерфейс полностью абстрактный, который не может иметь конструктор, экземпляр и статические блоки, и он содержит только два типа членов 1.public абстрактный метод 2.public-static-final переменная 

* Оба не могут быть созданы, но ссылка может быть создана. 

* Какой из них подходит лучше, зависит от приложения- Интерфейсы полезны, потому что классы Java не поддерживают множественное наследование, а интерфейсы поддерживают.

Абстрактные классы полезны, когда вам нужно конкретное поведение базового класса.

0
R.B.REJO