Зачем использовать интерфейсы, множественное наследование и интерфейсы, преимущества интерфейсов? - PullRequest
61 голосов
/ 16 декабря 2011

У меня все еще есть некоторая путаница по поводу этой вещи.До сих пор я находил

(Подобные вопросы уже задавались здесь, но у меня были другие вопросы.)

  1. Интерфейс - это коллекция ТОЛЬКОабстрактные методы и конечные поля.

  2. В Java нет множественного наследования.

  3. Для достижения множественного наследования в Java можно использовать интерфейсы.

  4. Одним из сильных сторон наследования является то, что мы можем использовать код базового класса в производном классе, не записывая его снова.Может быть, это самое важное для наследства.

Сейчас ..

Q1.Поскольку интерфейсы имеют только абстрактные методы (без кода), как мы можем сказать, что если мы реализуем какой-либо интерфейс, то это наследование?Мы не используем его код.

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

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

Тогда зачем создавать интерфейсы?

ПРИМЕЧАНИЕ: Я нашел один случай, когда интерфейсы полезны.Одним из примеров этого является то, что в интерфейсе Runnable у нас есть публичный метод void run (), в котором мы определяем функциональность потока, и существует встроенное кодирование, согласно которому этот метод будет запускаться как отдельный поток.Так что нам просто нужно написать код, что делать в потоке, Rest предопределен.Но и этого можно добиться с помощью абстрактных классов и всего остального.

Тогда каковы точные преимущества использования интерфейсов?Это действительно множественное наследование, которое мы достигаем с помощью интерфейсов?

Ответы [ 12 ]

0 голосов
/ 10 июня 2017

Интерфейсы

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

Пример: Вам может просто понадобиться Vehicle длятранспортировать товары, вас не волнует конкретный вид транспорта.

Наследование

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

Пример: Возможно, вам потребуется Plane реализация автомобиля для быстрой транспортировки.

Композиция

Композиция может использоваться как альтернатива наследования.Вместо вашего класса, расширяющего базовый класс, он создается с объектами, которые реализуют меньшие части ответственности основного класса.Композиция используется в facade pattern и decorator pattern.

Пример: Вы можете создать класс DuckBoat ( DUKW ), который реализует LandVehicle иWaterVehicle, которые оба реализуют Vehicle, состоящий из Truck и Boat реализаций.

Ответы

Q1.Поскольку интерфейсы имеют только абстрактные методы (без кода), как мы можем сказать, что если мы реализуем какой-либо интерфейс, то это наследование?Мы не используем его код.

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

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

Интерфейсы не достигают множественного наследования.Они выражают, что класс может подходить для нескольких ролей.

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

Одним из основных преимуществ интерфейсов является разделение задач:

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

InВ духе DRY вы можете написать реализацию, которая удовлетворяет интерфейсу, и изменить его, сохраняя при этом open/closed principal, если вы используете композицию.

0 голосов
/ 21 июля 2015

Интерфейсы сделаны так, чтобы класс реализовывал функциональность в интерфейсе и вел себя в соответствии с этим интерфейсом.

...