【问题标题】:Can a default method implementation be used to implement an abstract method in a base class可以使用默认方法实现来实现基类中的抽象方法吗
【发布时间】: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

我猜测类中的抽象方法比接口中的默认方法“更重要”。

有什么好方法可以让这项工作发挥作用吗?

我的根本问题是我有一个三层抽象类层次结构(AB 扩展 CDE 扩展 FCF 扩展 @ 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() { ... }
}

【问题讨论】:

  • 不能C1C2 是扩展C 的抽象类吗?
  • C1 和 C2 不能扩展 C,因为 A1 和 B1 实际上扩展了 A 和 B。修复问题以反映这一点。

标签: java inheritance default


【解决方案1】:

只需从您的具体类中调用默认方法:

@Override
public void foo() {
    Inter.super.foo();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多