只有子类覆盖Java中的接口方法

时间:2013-08-31 12:19:52

标签: java interface

我知道实现某些Interface的每个类都必须覆盖其所有方法。除非当前的班级是abstract

正如您所看到的,在下面提到的代码模板中演示了这一点。

在我的情况下,只有ChildClass会覆盖foo()方法。

接口

public interface MyItf {
   public void foo();
}

家长班

public abstract class ParentClass implements MyItf {

}

儿童课

public class ChildClass extends ParentClass{

  @Override
  public void foo() {

  }
}

但是这个实现要求我将ParentClass类设置为abstract

如果我想让ParentClass成为单一类而不是抽象,该怎么办?

是否有人有其他方式只有孩子使用MyItf但不使用父类?

谢谢,

[编辑]

基于所有答案,我在我的案例中找到了解决方案:

我编写了一个游戏,我有140个子类。

为了使代码更灵活,我需要创建“空”界面并允许所有孩子实现它,例如:

 public interface UnknownItf {

 }

所以下次如果我需要为孩子添加新界面,我只会写:

public interface UnknownItf extends NewItf{
   ///...
}

4 个答案:

答案 0 :(得分:6)

  

如果我想将ParentClass保留为单个类而不是抽象,该怎么办?

嗯,你不能 - 你已经声明它实现了界面,但是你没有提供任何实现。

换句话说,您希望此代码能做什么?

MyItf itf = new ParentClass();
itf.foo();

如果ParentClass具体,那就必须编译......但是您没有为foo提供任何实施。

如果您只希望子类实现MyItf,那么就不要声明超类实现它。如果您试图强制所有子类来实现它,而不是超类,并且您不希望超类是抽象的,那么我很害怕&# 39;没办法做到这一点 - 即使有可能,这也是一个值得怀疑的设计。 (它将如何有用?)

答案 1 :(得分:1)

  

是否有人有其他方式只有孩子使用MyItf但不使用Parent类?

不要让父类实现接口并让子类实现接口。

该语言不能正确地允许您同时执行这两种操作(将父类声明为接口类型然后跳过实现方法,如果您希望跳过实现它不完整的方法,因此应该是抽象的)

答案 2 :(得分:1)

如果一个类实现了一个接口,那么该类或其超类必须实现接口方法或者是抽象的。 两者同时也是可能的。然后,孩子们不需要实施这些方法。

如果你只想让孩子实现干涉,那就把它写给子类而不是超类

答案 3 :(得分:0)

为什么你不能这样做的原因很简单:

编译器发现ParentClass实现了MyItf接口,然后尝试查找foo方法的实现。 以下:

public class ParentClass implements MyItf

表示: Java编译器 ParentClass 将实现 MyItf

中定义的所有方法

所以你无法告诉编译器:

“JAVAC不用担心!! ParentClass 有一些ChildClass 实施foo方法。所以继续......“