簡體   English   中英

可以使用默認方法實現來在基類中實現抽象方法

[英]Can a default method implementation be used to implement an abstract method in a base class

如果我有一個抽象方法的類:

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擴展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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM