Есть ли способ НЕ реализовать все методы интерфейса в наследующем классе?
Не реализуя все методы интерфейса. Является ли это возможным?
Ответ 1
Единственный способ обойти это - объявить ваш класс abstract
и оставить его подклассу для реализации отсутствующих методов. Но, в конечном счете, кто-то в цепочке должен реализовать его, чтобы выполнить контракт на интерфейс. Если вам действительно не нужен конкретный метод, вы можете реализовать его, а затем либо return
либо NotImplementedException
какое-то разнообразие NotImplementedException
, в зависимости от того, что больше подходит в вашем случае.
Интерфейс также может указывать некоторые методы как "по умолчанию" и предоставлять соответствующую реализацию метода в определении интерфейса (https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html). Эти методы "по умолчанию" не должны упоминаться при реализации интерфейса.
Ответ 2
Точка интерфейса должна гарантировать, что объект будет внешне вести себя, поскольку интерфейс указывает, что он будет
Если вы не реализуете все методы своего интерфейса, вы уничтожаете всю цель интерфейса.
Ответ 3
Мы можем переопределить все методы интерфейса в родительском классе abstract
, а в дочернем классе - переопределить только те методы, которые необходимы этому конкретному дочернему классу.
Интерфейс
public interface MyInterface{
void method1();
void method2();
void method3();
}
Аннотация Родительский класс
public abstract class Parent implements MyInterface{
@Override
public void method1(){
}
@Override
public void method2(){
}
@Override
public void method3(){
}
}
В ваших дочерних классах
public class Child1 extends Parent{
@Override
public void method1(){
}
}
public class Child2 extends Parent{
@Override
public void method2(){
}
}
Ответ 4
Я задал себе тот же вопрос, а затем узнал об адаптерах. Это решило мою проблему, может быть, это может решить вашу. Это объясняет это очень хорошо: https://blogs.oracle.com/CoreJavaTechTips/entry/listeners_vs_adapters
Ответ 5
Определите этот класс как класс abstract
. Однако вы должны реализовать эти нереализованные методы, когда хотите создать экземпляр (либо с помощью подкласса, либо анонимного класса).
Ответ 6
Если вам нужен экземпляр класса, это невозможно. Однако вы можете попытаться определить класс abstract
.
Ответ 7
Можно и легко. Я закодировал пример.
Все, что вам нужно сделать, это наследовать от класса, реализующего метод. Если вы не возражаете против класса, который не является реальным, то вы также можете определить класс abstract
.
Ответ 8
Вы можете сделать это в Java8. Java 8 представляет новую функцию "Метод по умолчанию" или (методы Defender), которая позволяет разработчику добавлять новые методы в интерфейсы, не нарушая существующую реализацию этих интерфейсов.
Это обеспечивает гибкость, позволяющую интерфейсу определять реализацию, которая будет использоваться по умолчанию в ситуации, когда конкретный класс не сможет обеспечить реализацию для этого метода.
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();
}
}
Ответ 9
Если вы попытаетесь реализовать интерфейс и окажетесь в ситуации, когда нет необходимости реализовывать все из них, то это - запах кода. Это указывает на плохой дизайн и нарушает принцип подстановки Лискова. Часто это происходит из-за использования толстого интерфейса.
Также иногда это происходит потому, что вы пытаетесь реализовать интерфейс из внешней зависимости. В этом случае я всегда заглядываю внутрь исходного кода, чтобы увидеть, есть ли какая-либо реализация этого интерфейса, которую я могу либо использовать напрямую, либо подклассить, и переопределить методы для своих нужд.
Ответ 10
Мы можем использовать классы Adapter, которые уменьшают сложность, не делая обязательной реализацию всех методов, присутствующих в интерфейсе
Класс адаптера - это простой класс Java, который реализует интерфейс только с реализацией EMPTY. Вместо реализации интерфейса, если мы расширяем класс Adapter, мы предоставляем реализацию только для метода require
ex--- вместо реализации Servlet (I), если мы расширяем GenericServlet (AC), то мы предоставляем реализацию для метода Service(), нам не требуется предоставлять реализацию для оставшегося meyhod.
Общий класс Действует как класс ADAPTER для сервлета (I).