1

我知道每个实现 some 的类都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() {

  }
}

但是这个实现要求我将ParentClassclass 设置为abstract.

如果我想ParentClass成为单类而不是抽象的怎么办?

有没有人有其他只有孩子使用MyItf而不是父类的方式?

谢谢,

[编辑]

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

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

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

 public interface UnknownItf {

 }

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

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

4 回答 4

6

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

那么你不能 - 你已经声明它实现了接口,但你没有提供任何实现。

换句话说,你希望这段代码做什么?

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

如果ParentClass是具体的,那将不得不编译......但你没有为foo.

如果您只希望子类实现MyItf,那么就不要声明超类实现它。如果您试图强制所有子类实现它,而不是超类,并且您不希望超类是抽象的,那么恐怕没有办法做到这一点 - 这甚至是一个有问题的设计如果可能的话。(它有什么用处?)

于 2013-08-31T12:22:04.800 回答
1

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

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

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

于 2013-08-31T12:25:17.703 回答
1

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

如果您只想让孩子实现一个接口,请将其写入子类而不是超类

于 2013-08-31T12:25:45.000 回答
0

做不到的原因很简单:

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

public class ParentClass implements MyItf

意思是:Java 编译器ParentClass将实现MyItf中定义的所有方法

因此,您无法告诉编译器:

“JAVAC 别担心!!ParentClass 会有一些ChildClass会 实现该方法foo的。所以继续……”

于 2013-08-31T12:41:00.467 回答