我知道实现某些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{
///...
}
答案 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
方法。所以继续......“