Java の多重継承の問題を解決する方法を完全に理解しようとすると、明確にする必要がある古典的な疑問があります。
クラスがあり、Animal
このクラスにはサブクラスとがありBird
、は鳥であり馬でもあるため、から拡張するHorse
クラスを作成する必要があるとします。Pegasus
Bird
Horse
Pegasus
これは典型的なダイヤモンド問題だと思います。私が理解している限りでは、この問題を解決する典型的な方法はAnimal
、、Bird
およびHorse
クラスのインターフェースを作成し、Pegasus
そこから実装することです。
鳥や馬のオブジェクトを作成できる別の方法でこの問題を解決できるかどうか疑問に思っていました。動物も作成できる方法があれば素晴らしいですが、必須ではありません。
ベストアンサー1
public interface Equidae
馬や鳥などの動物クラス (生物学的な意味でのクラス) のインターフェースを作成することもできますpublic interface Avialae
(私は生物学者ではないので、用語が間違っている可能性があります)。
その後も作成できます
public class Bird implements Avialae {
}
そして
public class Horse implements Equidae {}
そしてまた
public class Pegasus implements Avialae, Equidae {}
コメントから追加:
重複コードを減らすために、実装する動物の共通コードのほとんどを含む抽象クラスを作成することができます。
public abstract class AbstractHorse implements Equidae {}
public class Horse extends AbstractHorse {}
public class Pegasus extends AbstractHorse implements Avialae {}
アップデート
もう1つ詳細を追加したいと思います。ブライアンの発言、これは OP がすでに知っていたことです。
ただし、強調しておきたいのは、インターフェースの「多重継承」問題を回避することを提案していること、および、すでに具体的な型 (Bird など) ではなく動作 (ダックタイピングを参照する人もいますが、これも良いのですが、ここでは単に鳥の生物学的クラスである Avialae) を表すインターフェースの使用は推奨しないということです。また、 のように大文字の 'I' で始まるインターフェース名の使用も推奨しません。これはIBird
、インターフェースが必要な理由について何も説明しません。これが質問の違いです。インターフェースを使用して継承階層を構築し、便利な場合は抽象クラスを使用し、必要な場合は具体的なクラスを実装し、適切な場合は委任を使用します。