2 Stimmen

Wann ist Schnittstellenvererbung in Java sinnvoll?

Werfen wir einen Blick auf den folgenden Code in Java.

interface FirstInaterface
{
    public void show();
}

interface SecondInterface extends FirstInaterface
{
    @Override
    public void show();

    public void someConcreteMethod();
}

interface ThirdInterface extends SecondInterface
{
    @Override
    public void show();
}

final class Demo implements ThirdInterface
{
    @Override
    public void show()
    {
        System.out.println("The show() method invoked");
    }

    @Override
    public void someConcreteMethod()
    {
        System.out.println("The someConcreteMethod() method invoked");
    }

}

final public class Main
{
    public static void main(String[] args)
    {
        Demo demo=new Demo();
        demo.show();
        demo.someConcreteMethod();
    }
}

Der obige Code in Java zeigt eine mehrstufige Vererbung von Schnittstellen, bei der ThirdInterface hat zwei Schnittstellen über sich. Die Methode show() wird erstens in der Schnittstelle SecondInaterface ahd dann wieder in der Schnittstelle ThirdInterface und diese Schnittstelle wird schließlich von der Klasse geerbt Demo .


Welche Version der show()-Methoden aus den oben genannten Schnittstellen wird in einem solchen Szenario von der Klasse Demo übernommen? Wie ist der Compiler in der Lage, eine bestimmte Version der show()-Methode dynamisch zur Laufzeit aufzulösen?


Ich denke, dass die show()-Methode in der letzten Schnittstelle in der obigen Schnittstellenvererbungshierarchie (nämlich ThirdInterface) vom Compiler aufgerufen wird. Wenn das so ist, dann sind die show()-Methoden in den beiden oben genannten Schnittstellen (nämlich FirstInaterface, SecondInaterface) nutzlos und dienen überhaupt keinem Zweck, da sie innerhalb von Schnittstellen deklariert sind, sie selbst können niemals überall ihre eigenen Implementierungen haben. Wann ist eine solche Art der Schnittstellenvererbung sinnvoll?

4voto

Michael Borgwardt Punkte 334642

Einzige Methode Implementierungen überschreiben können, nicht aber Methodenspezifikationen in einer Schnittstelle.

Welche Version der show()-Methoden aus den oben genannten Schnittstellen wird in einem solchen Szenario von der Klasse Demo übernommen? Wie ist der Compiler in der Lage, eine bestimmte Version der show()-Methode dynamisch zur Laufzeit aufzulösen?

Welche "Versionen"? Die Methodensignaturen sind identisch, so dass es eigentlich nur eine Methodenspezifikation gibt. Zur Laufzeit wird es eine Implementierungsklasse geben, und nur die Methodenimplementierung in dieser Klasse wird tatsächlich aufgerufen.

Wenn das so ist, dann sind die show()-Methoden in den beiden oben genannten Schnittstellen (nämlich FirstInaterface, SecondInaterface) nutzlos und dienen überhaupt keinem Zweck, da sie innerhalb von Schnittstellen deklariert sind, sie selbst können niemals irgendwo ihre eigenen Implementierungen haben.

Ähm, was ist mit Klassen, die FirstInterface direkt? Was keinen (technischen) Zweck erfüllt, ist das "Überschreiben" von Methoden in untergeordneten Schnittstellen. Wenn SecondInterface y ThirdInterface hatte keine show() Methode, hätte dies genau die gleiche syntaktische Wirkung.

Es kann jedoch einen triftigen Grund geben, Methoden in einer untergeordneten Schnittstelle zu überschreiben: um einen anderen Kommentar zu liefern, der semantische Änderungen im Methodenvertrag erklärt. Beispiele hierfür finden sich im Collections-Framework der Java-API: Set.add() hat einen anderen Vertrag als Collection.add() , da es die Einschränkung hinzufügt, dass keine doppelten Elemente hinzugefügt werden sollten.

1voto

jmj Punkte 232204

Welche Version der show()-Methoden aus den oben genannten Schnittstellen wird in einem solchen Szenario von der Klasse Demo übernommen? Wie ist der Compiler in der Lage, eine bestimmte Version der show()-Methode aufzulösen dynamisch zur Laufzeit auflösen?

 Demo demo=new Demo();

showMethod() des Objekts aufgerufen werden. Hier ist das Objekt also von der Klasse Demo so dass seine Version übernommen wird.

auch zur Kompilierzeit Demo Klasse muss eine Deklaration von show y someConcreteMethod Methode, sonst kommt es zu einem Kompilierfehler


Ich denke, dass die show()-Methode in der letzten Schnittstelle in der obigen Schnittstellenvererbungshierarchie (nämlich ThirdInterface) wie folgt aussehen wird vom Compiler aufgerufen wird

In der Schnittstelle können Sie die Implementierung nicht bereitstellen


Wenn dies der Fall ist, müssen die show()-Methoden in den beiden oben genannten Schnittstellen (nämlich FirstInaterface, SecondInaterface) Zweck, da sie innerhalb von Interfaces deklariert sind, sie selbst niemals irgendwo ihre eigenen Implementierungen haben können. Wenn ist eine solche Art der Schnittstellenvererbung sinnvoll?

Ja, es ist nur Erklärung.. auch es implizit erben von der übergeordneten Schnittstelle. so, wenn Sie es schreiben oder nicht es macht keinen Unterschied

1voto

WilQu Punkte 6853

Der Compiler wählt nicht die show() Methode einer beliebigen Schnittstelle: Sie ruft die Methode der Klasse auf, das ist alles. Die Schnittstellen sagen nur, dass eine Show-Methode in der Klasse implementiert sein muss.

Das Überschreiben einer Methode in einem Inteface ist nutzlos (außer vielleicht, wenn Sie Anmerkungen hinzufügen). Schnittstellenvererbung ist nur sinnvoll, wenn Sie Methoden hinzufügen.

1voto

pushy Punkte 9357

Der einzige Nutzen, den ich mir beim Überschreiben von Superinterface-Methoden in Subinterfaces vorstellen kann, ist die Dokumentation. Auf diese Weise sieht man auf einen Blick, welche Methoden diese Schnittstelle benötigt, und muss nicht erst in den Superinterfaces nachschauen, um zusätzliche Methoden zu finden. Es kann auch sinnvoll sein, wenn man die Verwendung einer Methode für diese Unterschnittstelle im Gegensatz zur Verwendung in der Oberschnittstelle oder in anderen Unterschnittstellen verdeutlichen will.

Für den Compiler macht es überhaupt keinen Unterschied, ob Sie diese Methoden überschreiben oder nicht.

Wenn Sie AOP-Sprachen wie AspectJ verwenden, könnten Sie natürlich eine implementierte Methode in eine Schnittstelle injizieren, und diese Frage könnte relevant werden. In diesen Fällen würde der Compiler die erste Implementierung nehmen, die er in der Schnittstellenhierarchie findet, beginnend mit der Schnittstelle, die Ihre Klasse implementiert.

0voto

Sumit Singh Punkte 24033

Die show() Methode der Demo aufgerufen werden, denn wenn Sie schreiben Demo demo=new Demo(); dann zur Laufzeit JVM run Methode von Klasse.... Schnittstelle sind nur Vertrag .... sie können nicht geben Implementierung
wenn Sie nicht überschreiben show(); and someConcrete() dann wird ein Kompilierzeitfehler angezeigt...

When such kind of interface inheritance is useful?   

Diese Art der Implementierung sind voll verwenden, weil der Wiederverwendung Fähigkeit, die bedeutet, dass es einige Verhalten in erste Schnittstelle, einige in 2. etwas in 3... und wenn u wollen eine Klasse, die alle diese Funktionalität und einige zusätzliche dann u haben 2 Weg...
1. eine andere Schnittstelle mit all diesen Funktionen erstellen.
2. machen Sie eine Schnittstelle und inharite es durch diese Schnittstelle, die einige Funktionalität haben und fügen Sie einige zusätzliche in Ihrer Schnittstelle.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X