2010-12-29 7 views
14

Mam interfejs Interface1. Mam jego implementację Imple implements Interface1 (wszystkie metody zostały zaimplementowane :)).Jeśli wywołasz metodę interfejsu, czy otrzyma ona treść metody z klasy implementacji i wykona?

Teraz rozważmy trzecią klasę CheckCall, mogę zadzwonić w klasie CheckCall jak wspominam poniżej:

Interface1 interface1; 
interface1.method(); 

Wszystkie niezbędne import zostały wykonane. Proszę powiedz mi, czy to możliwe, czy nie, jeśli nie, to dobrze, a jeśli tak, to powiedz mi, co się stanie, jeśli mam więcej niż jedną klasę implementującą dla tego samego interfejsu i robię to samo.

Odpowiedz

14

Cóż, nie można wywołać metodę bezpośrednio w interfejsie, ale może robić to, co napisałeś, bardziej lub mniej.

Napisałeś:

Interface1 interface1; 
interface1.method(); 

to będzie działać, jeśli to zrobić:

Interface1 interface1 = new CheckCall(); 
interface1.method(); 

potem powiedz mi, co się stanie, jeśli mieć więcej niż jedno klas IMPL dla taki sam interfejs i robię ten sam telefon

Dobrze, że jest miłą rzeczą Java: problem masz na myśli nazywa się „problem diament”:

http://en.wikipedia.org/wiki/Diamond_problem

I tak naprawdę nie istnieje w Javie, ponieważ w pełni obsługuje Java wielokrotnego dziedziczenia , ale tylko przez "dziedziczenie interfejsu wielokrotnego (Java)" (* patrz komentarz).

W twoim przypadku, gdy zadzwonisz pod numer interface1.method(), zadzwonisz pod numer Impl lub podasz CheckCall i nie jest możliwe pomylenie.

+0

Odnośnie wielokrotne dziedziczenie, ** ** ANY OOA/OOD może być czysto tłumaczona na OOP w Java przy użyciu tylko „interfejs dziedziczenie”. Heck, każdy OOA/OOD mógłby być banalnie przetłumaczony na język, który nie miałby nawet pojęcia "dziedziczenia implementacji" * (znanego również jako * "ponowne użycie kodu" *, co tak naprawdę nie ma wiele wspólnego z OO) . Jednak niektórzy ludzie nie rozumieją, że Java w pełni obsługuje MI ... :( – SyntaxT3rr0r

+0

OK, więc w jaki sposób twoja odpowiedź różni się od wszystkich innych odpowiedzi, które najwyraźniej przeszły na głos? Ponieważ nie mogę odróżnić, oprócz Dodany link wiki: –

+0

@Sean Patrick Floyd: ludzie mogą zgodzić się na odpowiedzi na SO? – SyntaxT3rr0r

0

Nie, musisz wywołać obiekt, który implementuje interfejs, a nie sam interfejs.

Edytuj: Zmienna z tym typem może być użyta, ale nadal musi być klasą, która implementuje ten typ. Nie można utworzyć wystąpienia interfejsu.

5

Tak, ale nie tak, jak to napisano. Trzeba powiedzieć:

Interface1 interface1 = new Imple(); 

Można utworzyć zmienną typu interfejsu, a następnie oznacz ją do klasy, która implementuje interfejs. Widać to dość często z kolekcji Java, na przykład:

List<String> a = new ArrayList<String>(); 
0

nr

jak nie można instanciate interfejs, musisz stworzyć Imple obiekt, aby użyć go jako Interface1 jeden tak:

Interface1 interface1 = new Imple(); 

interface1.method(); 

w rzeczywistości, główne zainteresowanie interfejs pochodzą z możliwością mieć metodę powrotu dowolny obiekt jego realizacji, bez konieczności martwienia się o danej realizacji. w twoim przypadku może to pokazuje się jako

public class CheckCall { 
    public Interface1 factoryMethod() { 
     return new Imple(); 
    } 

    public void test() { 
     Interface1 used = factoryMethod(); 

     used.method(); 
    } 
} 
1

Faktycznie, należy odwołać się do metod, za pomocą interfejsów, które je definiują, ale trzeba rzeczywistą klasę wykonawczą. Więc zazwyczaj robię to tak:

// the variable is of type Interface1 
Interface1 interface1 = new Imple(); 
// but the method will be executed on the Imple object 
interface1.method(); 
7

Oczywiście kod działa poprawnie! Trzeba tylko zainicjować zmienną interface1 przy użyciu rzeczywistej implementacji (np. Nowa metoda Imple()).

Sprawdź ten przykład, kiedyś swoje klasy nazwy:

public class CheckCall { 

    interface Interface1 { 
     void method(); 
    } 

    static class Imple implements Interface1 { 
     @Override 
     public void method() { 
      System.out.println("Imple.method1()"); 
     } 
    } 

    public static void main(String[] args) { 
     Interface1 interface1; 
     interface1 = new Imple(); 
     interface1.method(); 
    } 

} 
Powiązane problemy