避免实现接口中的方法 – java

我有一个如下界面:

public interface a { public void m1(); public void m2(); public void m3(); } public class A implements a { public void m3() { // implementation code } } 

我想避免实现该方法的其余部分。 一种方法是在尝试实现interface的类中没有实现所有方法。

我该如何避免这种情况。 示例代码可以帮助我更好地理解:)

 public interface a{ public void m1(); public void m2(); public void m3(); } public abstract class A implements a{ public void m3(){ // implementation code } } 

声明为抽象类,因此您不需要在此类中实现这些方法。 但是你必须在具体的类中实现这些方法

接口的目的恰恰是强制所有实现类实现接口的方法,从而确保类与接口兼容。

如果你只想实现方法的一个子集,也许它不是你应该首先实现的接口。

使用abstract类而不是接口。

在这个抽象类中,

  1. Child类可选的方法 – 在抽象类中提供实现
  2. Child类必需的方法 – 在抽象类中声明为abstract,子类必须提供实现
  3. Child类无法覆盖的方法 – 在抽象类中声明为final,并提供实现

示例如下:

 abstract class MyClass { public void m1(){}; //class A can override, optional final public void m2(){}; //class A CANNOT override, has to use implementation provided here abstract public void m3(); //class A MUST override, mandatory } class A extends MyClass { @Override public void m3() { //mandatory } } 

除了你所说的,你可以做的最大值就是让你成为A类, abstract

 abstract class A implements a{ public void m3(){ // implementation code } 

Java 8的解决方案:

使用java 8 默认方法并将接口的定义更改为

 public interface a { public void m1(); public void m2(); default void m3(){ // Provide your default imp } } 

扩展包含默认方法的接口

扩展包含默认方法的接口时,可以执行以下操作:

  1. 根本没有提到默认方法,它允许扩展接口inheritance默认方法。
  2. 重新声明默认方法,使其成为抽象方法。
  3. 重新定义覆盖它的默认方法。

根据您的要求,您可以跳过在某些类( like A )中实现此默认方法,或者您可以覆盖其他一些类中的默认方法,或者通过将此方法重新声明为abstract来将此方法的实现委托给其他类。

Java 7或更早版本的解决方案

将接口定义分为两个子接口。

 public interface a { public void m1(); public void m2(); } public interface b{ public void m3(); } 

现在, class A只实现interface a ,其他类可以实现interface a and interface b

你应该尝试Abstract class 。 然后,您可以决定应该实现的方法是什么,以及不使用的方法是什么。

 public abstract class A { public abstract void m1(); public void m2() { } public void m3() { } 

}

 public class B extends A{ @Override public void m1() { // you have to override m1 only } } 

如果您不想实现接口的其他方法,请使用实现此方法的虚拟类,并在应用程序中inheritance该类。 这称为适配器模式,广泛用于swing的适配器类。

这样做的一个解决方案是创建一个Abstract类来实现接口的方法而不需要代码。 然后你的类A应该扩展抽象类并覆盖正确的方法。

编辑:这个解决方案使你的界面有点无用,除非它在许多实现中使用。

默认情况下,接口中的所有方法都是public abstract 。 如果您不想为inheritance的abstract方法添加实现,则需要将该类标记为abstract

 public abstract class A implements a { // Compiler will not prompt you with an error message. // You may add or do not add implementation for a method m3() } 

注意: 抽象类无法实例化。 如果要实例化它,可以添加空白实现或创建它的子类并在那里实现该方法。

在java 7之前你不能这样做。如果你只想实现接口中提供的一些方法,你必须使类抽象化。

但到目前为止,Java 8即将推出(尚未推出)lambda的function。 规范说您可以在接口本身中提供方法的默认实现。

例如

 public interface A { default void foo(){ System.out.println("Calling A.foo()"); } } public class Clazz implements A { } 

即使Clazz没有实现方法foo(),代码也会编译。 方法foo()现在由接口A提供默认实现。

你不解释为什么你需要这个,所以让我猜。 也许你需要一种快速的方法来为测试提供一些function。 或者你只是想要编译一些东西,这样你就可以运行一些unit testing,然后回来完成其余的工作。 或者您可能怀疑某些方法是多余的,并且永远不会在您的应用程序中调用。

这将涵盖以上所有内容:

 public class A implements a { public void m3() { throw new UnsupportedOperationException("This functionality has not been implemented yet."); } }