インターフェイスには実装がないため、次のことは Java では不可能です。
class A {
protected void foo() { /* A impl */ }
protected void baz() { /* impl */ }
}
interface B {
/* here's what's impossible to have in Java. */
protected void foo() { /* B impl incl. call to baz() */ }
}
class C extends A {
/* stuff that's not in B... */
}
class D extends C implements B {
void bar() { foo(); /* uses the B impl */ }
}
class E extends A {
void bar() { foo(); /* uses the A impl */ }
}
class F extends C implements B {
void bar() { foo(); /* uses the B impl */ }
}
私が望むのは、D が C を継承することですが、foo()
それ自体をオーバーライドする必要はありません。むしろ、単に「B からの既知の変更を使用する」ことを示したいだけです。このシナリオで正しいイディオムは何ですか?
ノート:
- はい、デザインを変更する必要があると思います。しかし、それを何に変更しますか?それを聞きに来たのです。
- 私はJavaを知っています。回答で抽象クラスとインターフェースを再説明しないでください。
- これは多重継承で可能だったはずです - D は C と B の両方を継承することができました (他に競合がないことを前提としています)。
- Java 6 をお願いします。絶対に必要な場合は Java 7。Java 8 は私には関係ありません。
- A 実装は実際にはデフォルトであり、他のクラスはそれから直接継承するため (クラス E など)、B 実装を A に移動することはできません。
- C と B はお互いになじみがなく、互いに言及することはできません。
- B 実装は、D に精通していない他のクラス (クラス F など) が必要とするため、D に移行することはできません。
- 誰の実装を使用するかに関してあいまいさがないため、これは多重継承のひし形の問題ではありません。A->B,C->D というひし形のパターンもありますが。