82

有没有办法不在继承类中实现接口的所有方法?

4

11 回答 11

71

解决此问题的唯一方法是将您的类声明为abstract并将其留给子类来实现缺少的方法。但最终,链中的某个人必须实现它以满足接口契约。如果您确实不需要特定的方法,您可以实现它,然后选择return或抛出一些NotImplementedException,以您的情况更合适。

接口还可以将一些方法指定为“默认”,并在接口定义中提供相应的方法实现 ( https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html )。在实现接口时无需提及这些“默认”方法。

于 2012-07-11T16:26:44.540 回答
69

接口的重点是保证对象的行为与接口指定的一样

如果您不实现接口的所有方法,那么您会破坏接口的全部用途。

于 2012-07-11T16:27:28.523 回答
17

我们可以覆盖父类中的所有接口方法,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(){

    }
}
于 2017-04-27T08:22:37.327 回答
5

我问自己同样的问题,然后了解了适配器。它解决了我的问题,也许它可以解决你的问题。这很好地解释了它:https ://blogs.oracle.com/CoreJavaTechTips/entry/listeners_vs_adapters

于 2013-08-16T02:20:52.890 回答
4

将该类定义为一个abstract类。但是,当您想要创建它的实例时(通过使用子类或匿名类),您必须实现那些未实现的方法。

于 2012-07-11T16:25:24.733 回答
4

这是可能的,而且很容易。我编写了一个示例

您所要做的就是从实现该方法的类继承。如果您不介意不可实例化的类,那么您也可以定义一个abstract类。

于 2012-07-11T16:33:58.613 回答
4

你可以在 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(); 
    }
}
于 2018-04-12T10:30:43.130 回答
3

如果你想要一个可实例化的类,那是不可能的。不过,您可以尝试定义一个abstract类。

于 2012-07-11T16:25:56.043 回答
1

如果您尝试实现一个接口并且发现自己处于不需要实现所有接口的情况下,这就是代码异味。它表明一个糟糕的设计,它违反了Liskov 替换原则。这通常是因为使用胖接口而发生的。

有时也会发生这种情况,因为您试图从外部依赖项实现接口。在这种情况下,我总是查看源代码,看看是否有该接口的任何实现,我可以直接使用它,也可以对其进行子类化,并根据我的需要覆盖方法。

于 2019-01-31T16:58:52.493 回答
1

我们可以使用适配器类,通过不强制实现接口中存在的所有方法来降低复杂性

适配器类是一个简单的 java 类,它实现了一个只有 EMPTY 实现的接口。如果我们扩展 Adapter 类而不是实现接口,我们只为 require 方法提供实现

ex--- 如果我们扩展 GenericServlet(AC) 而不是实现 Servlet(I),那么我们为 Service() 方法提供实现,我们不需要为剩余的方法提供实现..

泛型类 充当 Servlet(I) 的 ADAPTER 类。

于 2019-04-05T06:13:59.353 回答
0

是的,下面显示的是方法

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();
   }
}
于 2020-12-22T18:11:14.703 回答