Warum kann eine Schnittstelle keine andere Schnittstelle implementieren?


104

Was ich meine ist:

interface B {...}

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

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

Ich googeln es und ich fand dies :

implementsbezeichnet das Definieren einer Implementierung für die Methoden einer Schnittstelle. Schnittstellen sind jedoch nicht implementiert, sodass dies nicht möglich ist.

Die Schnittstelle ist jedoch eine 100% abstrakte Klasse, und eine abstrakte Klasse kann Schnittstellen (100% abstrakte Klasse) implementieren, ohne ihre Methoden zu implementieren. Was ist das Problem, wenn es als "Schnittstelle" definiert wird?

Im Detail,

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

Antworten:


110

implementsbedeutet Implementierung, wenn erklärt werden interfacesoll, nur um interfacenicht für die Implementierung vorzusehen .

Ein 100% abstract classentspricht funktional einem interface, kann aber auch implementiert werden, wenn Sie dies wünschen (in diesem Fall bleibt es nicht 100% abstract). Aus Sicht der JVM handelt es sich also um verschiedene Dinge.

Auch die Mitgliedsvariable in einer 100% abstrakten Klasse kann ein beliebiges Zugriffsqualifikationsmerkmal haben, wo sie in einer Schnittstelle implizit sind public static final.


8
Ab Java 8 können Schnittstellen Standardmethoden haben, wodurch sie in dieser Hinsicht abstrakten Klassen viel ähnlicher sind.
Forresthopkinsa

4
Danke für den letzten Satz!
Tao Zhang

24

implementsbedeutet, dass ein Verhalten für abstractMethoden definiert wird (außer natürlich für abstrakte Klassen), definieren Sie die Implementierung.

extends bedeutet, dass ein Verhalten vererbt wird.

Mit Schnittstellen kann man sagen, dass eine Schnittstelle das gleiche Verhalten wie eine andere haben sollte, es gibt nicht einmal eine tatsächliche Implementierung. Aus diesem Grund ist es sinnvoller, eine Schnittstelle zu einer extendsanderen Schnittstelle zu erstellen, als sie zu implementieren.


Denken Sie nebenbei daran, dass eine abstractKlasse , selbst wenn sie abstractMethoden definieren kann (wie es eine Schnittstelle tut), immer noch eine Klasse ist und immer noch vererbt (erweitert) und nicht implementiert werden muss.


4

Konzeptionell gibt es die beiden "Domänen" -Klassen und -Schnittstellen. Innerhalb dieser Domänen, die Sie immer erweitern, implementiert nur eine Klasse eine Schnittstelle, die sozusagen "die Grenze überschreitet". Grundsätzlich "erweitert" für Schnittstellen das Verhalten für Klassen. Zumindest denke ich, dass dies die Logik dahinter ist. Es scheint, als ob nicht alle mit dieser Art von Logik einverstanden sind (ich finde es selbst ein bisschen erfunden), und tatsächlich gibt es keinen technischen Grund, überhaupt zwei verschiedene Schlüsselwörter zu haben.


Wenn "Y X erweitert" und nicht versiegelt ist, kann ein anderer Typ "Z" verwendet werden, der "Y" erweitert. Dies gilt unabhängig davon, ob X eine Schnittstelle oder eine Klasse ist. Wenn "W X implementiert", ist es jedoch nicht möglich, dass "V W implementiert". Die Tatsache, dass "erweitert" "verkettet" und "implementiert" werden kann, scheint kein guter Grund für unterschiedliche Schlüsselwörter zu sein.
Supercat

2

Die Schnittstelle ist jedoch eine 100% abstrakte Klasse, und die abstrakte Klasse kann die Schnittstelle (100% abstrakte Klasse) implementieren, ohne ihre Methoden zu implementieren. Was ist das Problem, wenn es als "Schnittstelle" definiert wird?

Dies ist einfach eine Frage der Konvention. Die Autoren der Java-Sprache entschieden, dass "Erweitern" der beste Weg ist, um diese Beziehung zu beschreiben, also verwenden wir das alle.

Obwohl eine Schnittstelle "eine 100% abstrakte Klasse" ist, denken wir im Allgemeinen nicht so über sie. Wir betrachten Schnittstellen normalerweise als ein Versprechen, bestimmte Schlüsselmethoden zu implementieren, anstatt eine Klasse, von der abgeleitet werden kann. Daher verwenden wir für Schnittstellen tendenziell eine andere Sprache als für Klassen.

Wie andere sagen, gibt es gute Gründe für die Wahl von "erweitert" gegenüber "Geräten".


Jawohl. Es ist eine Frage der Konvention. Viele Menschen versuchen, die ursprünglichen Java-Sprachbeschränkungen von Sun logisch zu rechtfertigen , wenn dies nur eine persönliche Sichtweise ist. Sollte der Compiler "Implementierungs" -Schnittstellen hinzugefügt haben, hätten dies wahrscheinlich auch dieselben Leute gerechtfertigt. :-)
Little Santi

1

Ich hoffe, dies wird Ihnen ein wenig helfen, was ich während meines Studiums in oops (Core Java) gelernt habe.

Implementiert bezeichnet das Definieren einer Implementierung für die Methoden einer Schnittstelle. Schnittstellen sind jedoch nicht implementiert, sodass dies nicht möglich ist. Eine Schnittstelle kann jedoch eine andere Schnittstelle erweitern, was bedeutet, dass sie weitere Methoden hinzufügen und ihren Typ erben kann.

Hier ist ein Beispiel unten, dies ist mein Verständnis und was ich in oops gelernt habe.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

und denken Sie an eine Sache: Eine Schnittstelle kann nur eine andere Schnittstelle erweitern. Wenn Sie ihre Funktion für eine Klasse definieren möchten, wird nur eine Schnittstelle implementiert, z. B. unten

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Wenn eine Klasse diese Schnittstelle implementieren würde, würde sie folgendermaßen aussehen:

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

und wenn eine abstrakte Klasse eine abstrakte Funktion zum Definieren und Deklarieren hat und Sie diese Funktion definieren möchten oder sagen können, dass Sie diese Funktion implementieren, nehmen Sie an, diese Klasse zu erweitern, da die abstrakte Klasse nur erweitert werden kann. Hier ist ein Beispiel unten.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Hier ist eine Beispielunterklasse von MyAbstractClass:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

0

Die Schnittstelle ist wie eine Abstraktion, die keine Funktionalität bietet. Daher werden die anderen Abstraktionen oder Schnittstellen nicht "implementiert", sondern erweitert.


-6

Interface ist die Klasse, die eine abstrakte Methode enthält, die kein Objekt erstellen kann. Da Interface das Objekt nicht erstellen kann und keine reine Klasse ist, lohnt es sich nicht, es zu implementieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.