Nicht alle Methoden der Schnittstelle implementieren. ist es möglich?


Antworten:


63

Die einzige Möglichkeit, dies zu umgehen, besteht darin, Ihre Klasse als zu deklarieren abstractund sie einer Unterklasse zu überlassen, um die fehlenden Methoden zu implementieren. Aber letztendlich muss jemand in der Kette es implementieren, um den Schnittstellenvertrag zu erfüllen. Wenn Sie eine bestimmte Methode wirklich nicht benötigen, können Sie sie implementieren und dann entweder returnoder eine Vielzahl von Methoden NotImplementedExceptionauslösen, je nachdem, was in Ihrem Fall besser geeignet ist.

Die Schnittstelle kann auch einige Methoden als "Standard" angeben und die entsprechende Methodenimplementierung innerhalb der Schnittstellendefinition bereitstellen ( https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html ). Diese 'Standard'-Methoden müssen bei der Implementierung der Schnittstelle nicht erwähnt werden.


4
Ich habe eine Folgefrage. Ich habe immer nur die compare()Funktion der ComparatorSchnittstelle implementiert, um Objekte mit zu sortieren Arrays.sort(). Aber jetzt, wo ich den Javadoc öffne , sehe ich, dass dort viel mehr Methoden definiert sind. Wie konnte ich das dann tun?
John Red

1
@ JohnRed Schauen Sie sich diesen Javadoc noch einmal an. Abgesehen von "Vergleichen" und "Gleich" ist jede Methode entweder staticoder markiert default. In der Dokumentation zu "equals" wird auch erwähnt: "Beachten Sie, dass es immer sicher ist, Object.equals (Object) nicht zu überschreiben."
Tin Wizard

@TinWizard Ist es "sicher" - es wird kein Fehler bei der Kompilierung ausgelöst - Gleichungen aus dem Comparator-Vertrag nicht zu überschreiben oder eine Klasse (die Comparator implementiert) implizit von Object erbt und daher ist die Implementierung der gleichen Methode bereits vorhanden. " implizit"?
Veritas

66

Der Zweck einer Schnittstelle besteht darin, sicherzustellen, dass sich ein Objekt äußerlich so verhält, wie es die Schnittstelle angibt

Wenn Sie nicht alle Methoden Ihrer Schnittstelle implementieren, zerstören Sie den gesamten Zweck einer Schnittstelle.


Klar und verständlich
Mohammed Nathar

16

Wir können alle Schnittstellenmethoden in der abstractübergeordneten Klasse überschreiben und in der untergeordneten Klasse nur die Methoden überschreiben, die von dieser bestimmten untergeordneten Klasse benötigt werden.

Schnittstelle

public interface MyInterface{
    void method1();
    void method2();
    void method3();
}

Abstrakte Elternklasse

public abstract class Parent implements MyInterface{
@Override
public void method1(){

}
@Override
public void method2(){

}
@Override
public void method3(){

}
}

In Ihren Kinderklassen

public class Child1 extends Parent{
    @Override
    public void method1(){

    }
}




public class Child2 extends Parent{
    @Override
    public void method2(){

    }
}


4

Definieren Sie diese Klasse als abstractKlasse. Sie müssen diese nicht implementierten Methoden jedoch implementieren, wenn Sie eine Instanz davon erstellen möchten (entweder mithilfe einer Unterklasse oder einer anonymen Klasse).


3

Wenn Sie eine instanziierbare Klasse möchten, ist dies nicht möglich. Sie können jedoch versuchen, eine abstractKlasse zu definieren .


3

Es ist möglich und es ist einfach. Ich habe ein Beispiel codiert .

Sie müssen lediglich von einer Klasse erben, die die Methode implementiert. Wenn Ihnen eine Klasse, die nicht instanziierbar ist, nichts ausmacht, können Sie auch eine abstractKlasse definieren .


Das heißt, sie sind implementiert.
Tony Hopkinson

1
@ TonyHopkinson Sie sind implementiert, aber nicht in der Klasse.
Emory

6
Nun ja, aber die Frage war, wie man nicht implementiert, nicht wie man woanders implementiert.
Tony Hopkinson

3

Sie können dies in Java8 tun. Java 8 führt die neue Funktion "Standardmethode" oder (Verteidigungsmethoden) ein, mit der Entwickler den Schnittstellen neue Methoden hinzufügen können, ohne die vorhandene Implementierung dieser Schnittstellen zu beschädigen.

Es bietet Flexibilität, um die Implementierung der Schnittstellendefinition zu ermöglichen, die standardmäßig verwendet wird, wenn eine konkrete Klasse keine Implementierung für diese Methode bereitstellt.

interface OldInterface {
    public void existingMethod();

    default public void DefaultMethod() {
        System.out.println("New default method" + " is added in interface");
    }
}
//following class compiles successfully in JDK 8
public class ClassImpl implements OldInterface {
    @Override
    public void existingMethod() {
        System.out.println("normal method");

    }
    public static void main(String[] args) {
        ClassImpl obj = new ClassImpl ();
        // print “New default method add in interface”
        obj.DefaultMethod(); 
    }
}

1

Wenn Sie versuchen, eine Schnittstelle zu implementieren, und sich in einer Situation befinden, in der nicht alle implementiert werden müssen, ist dies ein Codegeruch. Es weist auf ein schlechtes Design hin und verstößt gegen das Liskov-Substitutionsprinzip . Oft geschieht dies aufgrund der Verwendung von Fettschnittstelle .

Manchmal passiert dies auch, weil Sie versuchen, eine Schnittstelle aus einer externen Abhängigkeit zu implementieren. In diesem Fall schaue ich immer im Quellcode nach, ob es eine Implementierung dieser Schnittstelle gibt, die ich entweder direkt verwenden oder in Unterklassen unterteilen und Methoden nach meinen Anforderungen überschreiben kann.


1

Wir können Adapterklassen verwenden, wodurch die Komplexität verringert wird, indem nicht alle in der Schnittstelle vorhandenen Methoden implementiert werden müssen

Die Adapterklasse ist eine einfache Java-Klasse, die eine Schnittstelle mit nur leerer Implementierung implementiert. Anstatt die Schnittstelle zu implementieren, wenn wir die Adapterklasse erweitern, stellen wir die Implementierung nur für die erforderliche Methode bereit

Beispiel: Anstatt Servlet (I) zu implementieren, wenn wir GenericServlet (AC) erweitern, stellen wir die Implementierung für die Service () -Methode bereit. Wir müssen keine Implementierung für das verbleibende Meyhod bereitstellen.

Generische Klasse Dient als ADAPTER-Klasse für Servlet (I).


0

ja möglich unten gezeigt ist der weg

interface Test {
   void m() throws NullPointerException;
}
class Parent {
   // Parent class doesn't implements Test interface
   public void m() {
      System.out.println("Inside Parent m()");
   }
}
class Child extends Parent implements Test {
}
public class Program {
   public static void main(String args[]) {
      Child s = new Child();
      s.m();
   }
}
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.