Beshere
@Beshere
Инженер-программист

Почему используют interface a не abstract class?

В примерах к курсам и книгам, где рассматриваются вопросы паттернов ООП и фреймворки, почти везде используются интерфейсы по такому типу:

interface Button;
class MyButton implements Button;

Т.е. имеется ввиду абстракция, но используется механизм интерфейса. Почему?

Логичнее выглядит так:

abstract class Button;
class MyButton extends Button;
А уж интерфейсы типа Clickable применять потом.
  • Вопрос задан
  • 737 просмотров
Решения вопроса 1
SergeyEgorov
@SergeyEgorov
Веб разработчик
Абстрактный класс может реализовать некое базовое поведение, которое затем унаследуют потомки, а интерфейс это в чистом виде контракт, никакого поведения, только сигнатуры.

Если никакого базового поведения, которое могли бы использовать потомки нет, то нет смысла и использовать абстрактный класс.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
profesor08
@profesor08
Все зависит от того, что тебе действительно нужно. Либо тебе надо расширить функционал кнопки, и ты наследуешься от нее, либо тебе нужен функционал кнопки в твоем классе, и ты имплементируешь интерфейс кнопки.
class Button;
class RedButton extends Button;

interface Button;
class Image implements Button;
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Вопрос поставлен некорректно.
Во-первых, что имел в виду автор той или иной книги, ведомо только ему, и если из книги это непонятно, то тут два варианта - либо книга отстой, либо ты не готов читать эту книгу.
Во-вторых, утверждение "имеется ввиду абстракция, но используется механизм интерфейса" некорректно. Интерфейсы в джаве это один из механизмов построения абстракций.

Ни первый, ни второй примеры не выглядят логичными. Интерфейсы без методов(маркерные интерфейсы) применяются достаточно редко и в специфичных ситуациях(пример - java.util.RandomAccess, маркирующий бесплатный доступ к произвольному элементу коллекции).
Абстрактный класс без состояния и методов вообще не нужен, тк будет затруднять разработку пользователя этого класса.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
И первое, и второе имеет право на жизнь.

Второе действительно используется чаще: у нас есть готовая или полуготовая кнопка, и надо добавить в неё функциональность Нашей Крутой Кнопки™. К тому же слова вроде Clickable лучше подходят для названий интерфейса, чем Button.
class Button {
  protected void paint(Canvas aCanvas) {}
}

class MyButton extends Button {
  @Override
  protected void paint(Canvas aCanvas) {}
}


А первое — например, мы хотим с Нашей Крутой Кнопкой™ работать как с кнопкой неизвестной функциональности, которая умеет только нажиматься и говорить, в каком она состоянии.
interface Button {
  void press();
  boolean state();
  void addListener(ButtonListener x);
}

class GameObject {
  void paint(Renderer renderer);
}

class MyButton extends GameObject implements Button {
}

class FridgeGame implements ButtonListener {  // помните, такая была в «Братьях Пилотах»?
  Button buttons[][] = new MyButton[4][4];  
}
Ответ написан
в джаве класс может имплементировать больше одного интерф
interface A {
}

interface B {
}

class X implements A, B {
}

но только один суперкласс
class X extends Y {
}

и например аннотации это интерфайсы
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}
Ответ написан
@Andrey17
Интерфейсы нужны для описания поведения объектов, например самолет и птица имею одинаковое поведение, оба могут взлетать и садиться. То есть описывает поведение полета.

interface Flyable {
  public up();
  public down();
}


Абстракции же описывают конкретные действия абстракции\объекта, например самолет может выпустить шасси, птица подать голос перед взлетом.

abstract class Airplane implements Flyable {

  abstract public void openChassis();

  abstract public void closeChassis();

  public up() {
    closeChassis();
  }

  public down() {
    openChassis();
  }

}

abstract class Bird implements Flyable  {

  abstract public void song();

  public up() {
    song();
  }

  public down() {
  }

}


Далее идут конкретные реализации абстракций, унаследованные от самих абстракций, например Boinп747 extends Airplane, которые реализуют действия абстракции.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Петрович Санкт-Петербург
от 90 000 до 140 000 руб.
Rubbles (SBDA Group) Москва
от 100 000 до 200 000 руб.
До 140 000 руб.
22 авг. 2019, в 07:30
10000 руб./за проект
22 авг. 2019, в 02:23
60000 руб./за проект
22 авг. 2019, в 02:15
5000 руб./за проект