В чем преимущество использования интерфейсов

Скажем, у вас есть интерфейс

public interface Change {

    void updateUser();
    void deleteUser();
    void helpUser();

}

Я читал, что интерфейсы являются способом Java для реализации множественного наследования. Вы реализуете интерфейс, тогда у вас есть доступ к его методам. Я не понимаю, что методы не имеют никакого тела в интерфейсе, поэтому вам нужно дать им тело в своем классе. Поэтому, если интерфейс реализован более чем одним классом, вам нужно дать методу тело более чем в одном классе. Почему это лучше, чем просто использование отдельных методов в ваших классах, а не реализация интерфейса?

Ответ 1

Мой профессор в колледже однажды дал большой анекдот для описания полиморфизма и инкапсуляции. Так оно и было.


Кто-нибудь знает, как работает машина для соды? (Чувствуешь путаные взгляды на то, о чем мы даже говорим об этом.) Нет? Позвольте мне сказать вам.

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

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

Чтобы добавить к этому, вы знаете, как использовать машину сотовой связи , поэтому, если машинный интерфейс следует обычным машинным интерфейсом соды, вы можете использовать Это. Это называется интерфейсом. Машина может доставлять напитки из Антарктики на конвейерную ленту для всего, что вам нужно, до тех пор, пока вы получаете свой напиток, холодно, и вы возвращаетесь обратно.

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


Наверное, не дословно, а достаточно близко. По существу это сводится к двум концепциям: polymorphism и encapsulation. Дайте мне знать, если вы хотите уточнить.

Ответ 2

Отделяет то, что ожидающий от ожидающего от реализации. У вас есть чистый набор методов, которые вы можете назвать без каких-либо знаний о реализации. На самом деле некоторые библиотеки, такие как JMS и JDBC, предоставляют интерфейсы без каких-либо реализаций.

Это разделение означает, что вам не нужно знать класс какой-либо реальной реализации.

Ответ 3

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

Потому что если класс C реализует интерфейс I, вы можете использовать C всякий раз, когда ожидается I. Если вы не реализуете интерфейс, вы не сможете этого сделать (даже если вы предоставили все соответствующие методы, как это предусмотрено интерфейсом):

interface I {
    void foo();
}

class C1 implements I {
    public void foo() {
        System.out.println("C1");
    }
}

class C2 {  // C2 has a 'foo' method, but does not implement I
    public void foo() {
        System.out.println("C2");
    }
}

...

class Test {
    public static void main(String[] args) {
        I eye1 = new C1();  // works
        I eye2 = new C2();  // error!
    }
}

Ответ 4

Интерфейс позволяет гарантировать, что существуют определенные методы, и вернуть требуемые типы. Когда компилятор знает это, он может использовать это предположение для работы с неизвестными классами, как если бы они имели определенное известное поведение. Например, сопоставимый интерфейс гарантирует, что реализующий класс сможет сравнитьTo() некоторый похожий объект и вернет int.

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

Ответ 5

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

Ответ 6

Это упрощает определение API-интерфейсов с использованием интерфейсов, поэтому все конкретные реализации интерфейсов обеспечивают ожидаемые методы в каждом классе.

Он также предоставляет способ реализации множественного наследования, что невозможно (на Java) с прямым наследованием класса.