Dlaczego interfejs nie może zaimplementować innego interfejsu?

Chodzi mi o to, że:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

Wygooglowałem to i znalazłem to :

implements oznacza definiowanie implementacji dla metod interfejsu. Jednak interfejsy nie mają implementacji, więc nie jest to możliwe.

Interfejs jest klasą abstrakcyjną w 100%, A klasa abstrakcyjna może zaimplementować interfejsy (klasa abstrakcyjna w 100%) bez implementacji swoich metod. Na czym polega problem, gdy definiuje się go jako "interfejs"?

W szczegóły,

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B
Author: nbro, 2010-10-13

6 answers

implements oznacza implementację, gdy {[1] } oznacza deklarowanie tylko po to, aby dostarczyć interface nie do implementacji.

A 100% {[3] } jest funkcjonalnie równoważne interface, ale może również mieć implementację, jeśli chcesz (w tym przypadku nie pozostanie 100% abstract), więc z punktu widzenia JVM są to różne rzeczy.

Również zmienna członkowska w klasie 100% abstrakcyjnej może mieć dowolny kwalifikator dostępu, gdzie w interfejsie są niejawnie public static final.

 96
Author: Jigar Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 15:28:04

implements oznacza, że zachowanie będzie zdefiniowane dla metod abstract (Oczywiście z wyjątkiem klas abstrakcyjnych), definiujesz implementację.

extends oznacza, że zachowanie jest dziedziczone.

W przypadku interfejsów można powiedzieć, że jeden interfejs powinien mieć takie samo zachowanie jak inny, nie ma nawet rzeczywistej implementacji. Dlatego bardziej sensowne jest, aby interfejs do extends innego interfejsu zamiast go implementować.


Na marginesie, pamiętaj że nawet jeśli klasa abstract może definiować metody abstract (w rozsądny sposób, jaki robi interfejs), nadal jest klasą i nadal musi być dziedziczona (rozszerzona), a nie implementowana.

 22
Author: Colin Hebert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-26 14:16:15

Koncepcyjnie istnieją dwie klasy "domeny" i interfejsy. Wewnątrz tych domen zawsze rozszerzasz, tylko klasa implementuje interfejs, który jest rodzajem "przekraczania granicy". Tak więc zasadniczo "rozszerza" interfejsy odzwierciedlają zachowanie klas. Przynajmniej myślę, że to jest logika za. Wydaje się, że nie wszyscy zgadzają się z tego typu logiką (sam uważam to za trochę wymyślone), a w rzeczywistości nie ma technicznego powodu, aby mieć dwa różne słowa kluczowe w wszystkie.

 4
Author: Landei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-13 07:03:59

Jednak interfejs jest w 100% klasą abstrakcyjną, a klasa abstrakcyjna może implementuje interfejs (100% klasy abstrakcyjnej) bez implementacji jego metody. Na czym polega problem, gdy definiuje się go jako "interfejs"?

To po prostu kwestia konwencji. Pisarze języka java uznali, że "extends" jest najlepszym sposobem na opisanie tej relacji, więc tego wszyscy używamy.

Ogólnie rzecz biorąc, mimo że interfejs jest "klasą w 100% abstrakcyjną", nie myślimy o tędy. Zwykle myślimy o interfejsach jako obietnicy implementacji pewnych kluczowych metod, a nie klasy, z których możemy się wywodzić. I tak mamy tendencję do używania innego języka dla interfejsów niż dla klas.

Jak twierdzą inni, istnieją dobre powody dla wyboru" rozszerzeń "nad" implementacjami."

 2
Author: Josiah Yoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-18 13:11:35

Mam nadzieję, że to pomoże Ci trochę tego, czego nauczyłem się w Oops (core java) podczas mojego college ' u.

Implements oznacza definiowanie implementacji dla metod interfejsu. Jednak interfejsy nie mają implementacji, więc nie jest to możliwe. Interfejs może jednak rozszerzyć inny interfejs, co oznacza, że może dodać więcej metod i dziedziczyć swój typ.

Oto przykład poniżej, to jest moje zrozumienie i to, czego nauczyłem się w oops.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

I zachować jedną rzecz w umysł jeden interfejs może tylko rozszerzyć inny interfejs i jeśli chcesz zdefiniować jego funkcję na jakiejś klasie to tylko interfejs w zaimplementowanym np poniżej

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}
Jeśli Klasa zaimplementowałaby ten interfejs, tak by to wyglądało:
public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

I jeśli klasa abstrakcyjna ma jakąś abstrakcyjną funkcję define and declare i chcesz zdefiniować te funkcje lub możesz powiedzieć zaimplementować te funkcje, to przypuszczasz, że rozszerzysz tę klasę, ponieważ klasa abstrakcyjna może być tylko Rozszerzony. oto przykład poniżej.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Oto przykładowa podklasa MyAbstractClass:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}
 1
Author: XxANxX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 16:13:08

Interface to klasa, która zawiera abstrakcyjną metodę, która nie może utworzyć żadnego obiektu.Ponieważ interfejs nie może stworzyć obiektu i nie jest czystą klasą, nie warto go implementować.

 -5
Author: Sundeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-19 12:43:58