2013-07-16 24 views
11

Powiedzmy masz interfejsCo jest zaletą korzystania z interfejsów

public interface Change { 

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

} 

Czytałem, że interfejsy są sposobem Java zaimplementować wielokrotne dziedziczenie. Implementujesz interfejs, wtedy masz dostęp do jego metod. Czego nie rozumiem, to, że metody nie mają żadnych ciał w interfejsie, więc musisz dać im ciało w klasie. Więc jeśli interfejs jest zaimplementowany przez więcej niż jedną klasę, musisz podać metodę ciału w więcej niż jednej klasie. Dlaczego jest to lepsze niż posiadanie indywidualnych metod na zajęciach, a nie wdrażanie interfejsu?

+3

[Polimorfizm] (http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming) – Brian

+1

znajdziesz Interfejs przydatna, gdy zaczyna do projektowania bibliotekę i jego API kolego :) –

+0

@Brian, polimorfizm nie jest pełna odpowiedź, ponieważ to zachowanie może już zostać wygenerowane przez podklasę. – displayname

Odpowiedz

2

Interfejs zasadniczo gwarantuje, że wszystkie metody, które go dziedziczą, będą miały swoje metody, dzięki czemu można bezpiecznie wywoływać metodę w interfejsie dla wszystkiego, co ją dziedziczy.

6

Dlaczego korzystanie z poszczególnych metod jest lepsze niż wdrażanie interfejsu?

Bo jeśli klasa implementuje interfejs CI, można użyć C gdy oczekuje się, że I. Jeśli nie implementować interfejs, nie można tego zrobić (nawet jeśli podałeś wszystkich odpowiednich metod nakazanego przez interfejs):

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

interfejs pozwala zagwarantować, że niektóre metody istnieją i zwraca wymagane typy. Gdy kompilator o tym wie, może użyć tego założenia do pracy z nieznanymi klasami tak, jakby mieli pewne znane zachowanie. Na przykład, porównywalny interfejs gwarantuje, że klasa implementująca będzie w stanie porównaćTo() jakiś podobny obiekt i zwróci int.

To oznacza, że ​​można porównać cokolwiek który implementuje ten interfejs - tak można sortować niczego, co jest porównywalne zamiast pisać jedną metodę sortowania ciągów a inny do sortowania liczb całkowitych, a inny do sortowania LabelledBoxesOfBooks

8

Oddziela co się rozmówca oczekuje od wdrożenia. Masz czysty zestaw metod, do których możesz zadzwonić bez znajomości implementacji. W rzeczywistości niektóre biblioteki takie jak JMS i JDBC udostępniają interfejsy bez żadnych implementacji.

Ta separacja oznacza, że ​​nie musisz znać klasy jakiejkolwiek rzeczywistej implementacji.

+2

Dlaczego spadł tutaj? – arshajii

0

Ułatwia definiowanie interfejsów API za pomocą interfejsów, dzięki czemu wszystkie konkretne implementacje interfejsów zapewniają oczekiwane metody w każdej klasie.

Umożliwia również zaimplementowanie dziedziczenia wielokrotnego, co nie jest możliwe (w Javie) z prostym dziedziczeniem klasy.

24

Kiedyś mój profesor na uniwersytecie przedstawił wspaniałą anegdotę opisującą polimorfizm i enkapsulację. Tak to wyglądało.


Czy ktoś tutaj wie, jak działa automat sody? (Cue myli spojrzenia, dlaczego o tym rozmawialiśmy.) Nie? Pozwol sobie powiedziec.

Upuszczasz swoją zmianę, a wewnątrz maszyny znajduje się mała małpka, która liczy wszystkie zmiany, aby upewnić się, że masz wystarczająco dużo pieniędzy.Kiedy naciśniesz przycisk sody, pojawi się małe światełko informujące małpę, który przycisk nacisnąłeś, a jeśli wprowadziłeś odpowiednią ilość zmian, chwyta twój wybór i rzuca go do małej dziury, abyś mógł wziąć swoją sodę.

Jest to koncepcja enkapsulacji. Ukrywamy implementację maszyny sodowej. O ile nie ma jednego z tych fantazyjnych, przejrzystych okien, które pozwalają zobaczyć wnętrze, szczerze nie masz pojęcia, jak to działa. Wszystko, co wiesz, to to, że wkładasz trochę gotówki, naciskasz przycisk, a jeśli włożysz wystarczająco dużo, dostaniesz swój napój.

Aby dodać, że wiesz, jak wykorzystać maszynę Soda interfejs, więc dlatego tak długo jak interfejsu urządzenia następuje zwykle interfejs maszynowy soda, można go używać. Nazywa się to umową interfejsu. Maszyna może przynosić napoje z Antarktydy na przenośniku taśmowym, jeśli o to dbasz, tak długo jak wypijesz, jest zimno i dostajesz zwrot.

Polimorfizm polega na tym, że podczas korzystania z interfejsu maszyny sodowej może to robić różne rzeczy. Dlatego enkapsulacja i polimorfizm są ze sobą ściśle powiązane. W przypadku polimorfizmu, wiesz tylko, że używasz implementacji SodaMachine, którą można zmienić, i w rezultacie różne rzeczy można wykonać za kulisami. Prowadzi to do napędzającej koncepcji polimorfizmu, która jest zdolnością jednego obiektu, SodaMachine, do rzeczywistego działania zarówno jako MonkeySodaMachine i ConveyorSodaMachine w zależności od maszyny faktycznie za interfejsem.


Prawdopodobnie nie słowo w słowo, ale wystarczająco blisko. Zasadniczo sprowadza się to do dwóch pojęć: polymorphism i encapsulation. Daj mi znać, jeśli chcesz wyjaśnienia.

+3

Bardzo ładna analogia. Jednym z potężnych interfejsów, które możesz zrobić, to zamówić ciężarówkę pełną maszyn sodowych, które działają inaczej i umieszczają je wszystkie na tej samej liście. – jahroy

+0

mogłaby to być lepsza analogia, gdyby było więcej niż jedno małpy dla każdego innego typu napoju jako xMonkey.java, yMonkey.java. – ralzaul

+0

Czuję, że ten przykład maszyny sodowej jest bardziej związany z abstrakcją. IMO idk –

Powiązane problemy