Beshere
@Beshere
Разработчик

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

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

interface Button;
class MyButton implements Button;

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

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

abstract class Button;
class MyButton extends Button;
А уж интерфейсы типа Clickable применять потом.
  • Вопрос задан
  • 1270 просмотров
Решения вопроса 2
profesor08
@profesor08
Все зависит от того, что тебе действительно нужно. Либо тебе надо расширить функционал кнопки, и ты наследуешься от нее, либо тебе нужен функционал кнопки в твоем классе, и ты имплементируешь интерфейс кнопки.
class Button;
class RedButton extends Button;

interface Button;
class Image implements Button;
Ответ написан
Комментировать
SergeyEgorov
@SergeyEgorov
Веб разработчик
Абстрактный класс может реализовать некое базовое поведение, которое затем унаследуют потомки, а интерфейс это в чистом виде контракт, никакого поведения, только сигнатуры.

Если никакого базового поведения, которое могли бы использовать потомки нет, то нет смысла и использовать абстрактный класс.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
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);
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы