2013-07-16 2 views
11

Допустим, у вас есть интерфейсЧто такое преимущество использования интерфейсов

public interface Change { 

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

} 

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

+3

[полиморфизм] (http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming) – Brian

+1

вы найдете интерфейс полезно, когда вы начинаете для разработки библиотеки и ее API дружища :) –

+0

@ Брайан, полиморфизм не полный ответ, так как это поведение уже может быть создано путем подкласса. – displayname

ответ

2

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

6

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

Потому что если класс 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! 
    } 
} 
3

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

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

8

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

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

+2

Почему здесь внизу? – arshajii

0

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

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

24

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


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

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

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

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

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


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

+3

Очень хорошая аналогия. Один мощный интерфейс позволяет вам заказать грузовик с газированными машинами, которые все работают по-разному и помещают их в один список. – jahroy

+0

это могла быть лучшая аналогия, если было несколько обезьян для каждого типа напитка как xMonkey.java, yMonkey.java. – ralzaul

+0

Я чувствую, что этот пример машины соды больше связан с абстракцией. ИМО idk –

Смежные вопросы