2016-12-07 10 views
4

私は抽象メソッドを持つクラスを持っている場合:は、デフォルトのメソッドの実装は、基本クラスで抽象メソッドを実装するために使用することができます

abstract class Base { 
    abstract void foo(); 
} 

とデフォルトの実装で同じメソッドを宣言するインターフェース:

interface Inter { 
    default void foo() { 
     System.out.println("foo!"); 
    } 
} 

私は両方を実装/拡張するクラスで実装を提供する必要がありますか?

class Derived extends Base implements Inter { 

} 

これは動作するはずのように思えるが、私はDerivedが抽象的ではなく、抽象メソッドfooをオーバーライドしていないことをコンパイル・エラーが発生します。

私は、クラスの抽象メソッドがインターフェイスのデフォルトメソッドより "重要"であると推測しています。

これを行うには良い方法がありますか?

私の根本的な問題は、リーフ・クラスの複数の実装を持っている、私は(ABCを拡張し、DEFCFGを拡張を拡張)3つのレベルの抽象クラス階層を持っているということです。実装の各セットの中で、基底クラスで定義されて実施されている一般的な方法がありますので、私は

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() { ... } 
} 
+0

に」 '' C1'と 'C2'は' C'を拡張する抽象クラスですか? – shmosel

+0

C1とC2はCを拡張できません。なぜなら、A1とB1は実際にAとBを拡張しているからです。 –

答えて

4

を書くことを望んだことはちょうどあなたの具象クラスからデフォルトのメソッドを呼び出します。

@Override 
public void foo() { 
    Inter.super.foo(); 
} 
関連する問題