Gibt es eine Möglichkeit, NICHT alle Methoden einer Schnittstelle in einer ererbenden Klasse zu implementieren?
java
interface
abstract-class
Apurva Patil
quelle
quelle
Antworten:
Die einzige Möglichkeit, dies zu umgehen, besteht darin, Ihre Klasse als zu deklarieren
abstract
und 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 entwederreturn
oder eine Vielzahl von MethodenNotImplementedException
auslö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.
quelle
compare()
Funktion derComparator
Schnittstelle implementiert, um Objekte mit zu sortierenArrays.sort()
. Aber jetzt, wo ich den Javadoc öffne , sehe ich, dass dort viel mehr Methoden definiert sind. Wie konnte ich das dann tun?static
oder markiertdefault
. In der Dokumentation zu "equals" wird auch erwähnt: "Beachten Sie, dass es immer sicher ist, Object.equals (Object) nicht zu überschreiben."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.
quelle
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(){ } }
quelle
Ich stellte mir dieselbe Frage und lernte dann Adapter kennen. Es hat mein Problem gelöst, vielleicht kann es deins lösen. Dies erklärt es sehr gut: https://blogs.oracle.com/CoreJavaTechTips/entry/listeners_vs_adapters
quelle
Definieren Sie diese Klasse als
abstract
Klasse. 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).quelle
Wenn Sie eine instanziierbare Klasse möchten, ist dies nicht möglich. Sie können jedoch versuchen, eine
abstract
Klasse zu definieren .quelle
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
abstract
Klasse definieren .quelle
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(); } }
quelle
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.
quelle
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).
quelle
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(); } }
quelle