【发布时间】:2016-12-07 22:54:01
【问题描述】:
如果我有一个带有抽象方法的类:
abstract class Base {
abstract void foo();
}
和一个接口,它声明了具有默认实现的相同方法:
interface Inter {
default void foo() {
System.out.println("foo!");
}
}
我是否需要在实现/扩展两者的类中提供实现?
class Derived extends Base implements Inter {
}
看起来这应该可以工作,但我得到一个编译错误,Derived 不是抽象的,并且没有覆盖抽象方法 foo。
我猜测类中的抽象方法比接口中的默认方法“更重要”。
有什么好方法可以让这项工作发挥作用吗?
我的根本问题是我有一个三层抽象类层次结构(A 和 B 扩展 C、D 和 E 扩展 F、C 和 F 扩展 @ 987654334@),它将有多个叶子类的实现。在每组实现中,都有在基类中定义的通用方法被实现,所以我希望写
abstract class C extends G {
abstract void foo();
abstract void bar();
abstract void quz();
void baz() {
foo();
bar();
}
}
abstract class A extends C {
void quz() { /* impl */ }
}
abstract class B extends C {
void quz() { /* different impl */ }
}
interface C1 {
default void foo() { /* impl for first set of classes */ }
}
class A1 extends A implements C1 {
@Override void bar() { ... }
// foo implementation from C1
}
class B1 extends B implements C1 {
@Override void bar() { ... }
}
interface C2 {
default void foo() { /* impl for second set of classes */ }
}
class A2 extends A implements C2 {
@Override void bar() { ... }
// foo implementation from C2
}
class B2 extends B implements C2 {
@Override void bar() { ... }
}
【问题讨论】:
-
不能
C1和C2是扩展C的抽象类吗? -
C1 和 C2 不能扩展 C,因为 A1 和 B1 实际上扩展了 A 和 B。修复问题以反映这一点。
标签: java inheritance default