[英]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
。
我猜這個類中的抽象方法比界面中的默認方法“更重要”。
有沒有一個很好的方法來使這項工作?
我的根本問題是我有一個三級抽象類層次結構( 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.