Tro*_*els 5 java inheritance default
如果我有一个带有抽象方法的类:
abstract class Base {
abstract void foo();
}
Run Code Online (Sandbox Code Playgroud)
以及一个使用默认实现声明相同方法的接口:
interface Inter {
default void foo() {
System.out.println("foo!");
}
}
Run Code Online (Sandbox Code Playgroud)
我是否需要在实现/扩展两者的类中提供实现?
class Derived extends Base implements Inter {
}
Run Code Online (Sandbox Code Playgroud)
看起来这应该可以工作,但是我收到一个编译错误,该错误Derived不是抽象的并且不会覆盖抽象方法foo。
我猜测类的抽象方法比接口的默认方法“更重要”。
有什么好的方法可以使这项工作?
我的潜在的问题是,我有三级抽象类的层次结构(A和B延伸C,D并E延伸F,C和F延伸G),其将具有叶类的多个实现。在每组实现中,都有一些在基类中定义的通用方法被实现,所以我希望写
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() { ... }
}
Run Code Online (Sandbox Code Playgroud)
只需从您的具体类调用默认方法:
@Override
public void foo() {
Inter.super.foo();
}
Run Code Online (Sandbox Code Playgroud)