Gibt es eine Möglichkeit, NICHT alle Methoden einer Schnittstelle in einer ererbenden Klasse zu implementieren?
Gibt es eine Möglichkeit, NICHT alle Methoden einer Schnittstelle in einer ererbenden Klasse zu implementieren?
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 entweder return
oder eine Vielzahl von Methoden NotImplementedException
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.
static
oder markiert default
. 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.
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(){
}
}
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
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 .
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();
}
}
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.
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).
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();
}
}