是否可以使用默认方法实现在基类中实现抽象方法
如果我有一个抽象方法的类:
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
扩展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() { ... } }
只需从具体类中调用默认方法:
@Override public void foo() { Inter.super.foo(); }