Зачем прописывать методы в Interface когда можно так же в классе?

Как я понял в интерфейсе мы прописываем методы которые будут изменяться, но без реализации, чтобы BaseClass реализовал интерфейс, и тем самый использовал методы которые в свою очередь будут уже реализованы для определенных объектов. Вопрос: почему те же методы интерфейса не прописать в классе, просто так же без реализации методов, заготовки так сказать, но в классе?...

P.S. Речь идет об языке программирования Java
  • Вопрос задан
  • 891 просмотр
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Ответ явоспецифичный. Потому что один класс может реализовать сколько угодно интерфейсов, но наследуется лишь от одного класса.

Ответ концептуальный. Ромбическое наследование. От А наследуются B и C, от них обоих наследуется D.
1) Если в A есть поле, в D что, это поле будет в двух экземплярах? А если оно protected и в B мы добавили метод, который его меняет?
2) Если B и C переопределяют какой-то метод foo(), как быть D? А если нужна и версия B.foo(), и C.foo(), и они обе вызывают A.foo — получатеся D.foo вызовет A.foo дважды? А если в C есть второй метод bar(), который вызывает foo() и начинает вести себя не так, как надо, если мы берём реализацию B.foo()?
В общем, множественное наследование — хорошая штука, но ромбическое — штука опасная. В языке, где любое множественное наследование неизменно ромбическое, всё, что остаётся — делать такие условия, при которых ни 1, ни 2 не сработает.
Одно из таких условий — унаследоваться от одного класса и нескольких интерфейсов. 1) У интерфейса нет полей, и 2) эталонная реализация, существующая в некоторых языках программирования, в любом случае менее приоритетна, чем конкретная реализация из класса. Вызывать ту и другую нет смысла: если программист написал свою сверх эталонной — значит, он хочет сделать то же другим путём.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@red-barbarian
Интерфейс это некий протокол, договоренность между частями системы. Т. К. Мы выносим эту договоренность отдельно, мы можем менять одну часть не боясь нарушить что-то в другой.
Т. Е. В итоге из сложной системы мы сделали две боле простые подсистемы. Которые также могут использоваться и в других местах.
Это наиболее важное применение интерфейса. Хотя не единственная его польза.
Ответ написан
@Iloveski
Потому что интерфейс, с его методами без реализаций, реализует полиморфизм: "Один интерфейс. множество реализаций". Например.
interface MyInterface {
    void writeHelloWorld();
}
class A implements MyInterface {
    @Override
    public void writeHelloWorld() {
        System.out.println("A " + "says: Hello World");
    }
}
class B implements MyInterface {
    @Override
    public void writeHelloWorld() {
        System.out.println("B " + "says: Hello World");
    }
}
class MyClass {
    public static void main(String[] args) {
        MyInterface myInterfaceA = new A();
        MyInterface myInterfaceB = new B();
        myInterfaceA.writeHelloWorld();
        myInterfaceB.writeHelloWorld();
    }
}
Ответ написан
Acuna
@Acuna
Заполнил свой профиль
Интерфейсами очень хорошо реализовывать какие-либо слушатели или коллбеки для использования их значений извне.

Например:

public class MyClass {
  
  private String mess = "";
  private MyListener listener;
  
  public MyClass () {
    
    mess = "Успешно";
    
  }
  
  public void addListener (MyListener listener) {
    this.listener = listener;
  }
  
  public void connect () {
    
    listener.onSuccess (mess); // Какое-либо действие в случае успеха, например, подключение к серверу
    
  }
  
}

interface MyListener {
  
  void onSuccess (String mess);
  void onError (int code);
  
}

Теперь его можно вызвать следующим образом:

MyClass myClass = new MyClass ();

myClass.addListener (MyListener () {
  
  @Override
  public void onSuccess (String var1) {
     System.out.println (var1); // var1 имеет значение "Значение", которое мы получили в конструкторе класса MyClass. А тут с ней можно делать что угодно, например, слать HTTP-запросом куда-либо дальше.
  }
  
});

myClass.connect ();

Просто и наглядно. Еще удобно их пользовать для описания методов каком-либо классе, чтобы другим программерам было удобнее копаться в чужом коде.
Ответ написан
Ваш ответ на вопрос

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

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