1. ホーム
  2. java

[解決済み] Java多重継承

2022-04-23 01:52:39

質問

Java の多重継承の問題を解決する方法を完全に理解するために、私は古典的な質問を明確にしておく必要があります。

例えば、クラス Animal があり、これがサブクラス BirdHorse というクラスを作る必要があります。 Pegasus を継承する BirdHorse から Pegasus は鳥であり馬である。

これは典型的なダイヤモンドの問題だと思います。私が理解したところでは、これを解決する古典的な方法は Animal , BirdHorse クラスのインターフェイスを実装し Pegasus を使用します。

鳥や馬のオブジェクトを作ることはできるのですが、他に解決する方法はないでしょうか?もし、動物も作成できる方法があれば、それは素晴らしいことですが、必要ではありません。

解決方法を教えてください。

動物のクラス(生物学的な意味でのクラス)には、次のようなインターフェースを作ることができます。 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 {}


更新情報

もうひとつ、細かいことを付け加えたいと思います。として ブライアンの発言 これは、OPがすでに知っていたことです。

しかし、私が強調したいのは、インターフェースで多重継承の問題を回避することを提案していることと、具体的な型(例えば鳥)を表すインターフェースではなく、より振る舞いを表すインターフェース(他の人は鴨型と言いますが、それも良いですが、私は単に鳥類の生物学的分類、鳥綱を意味しています)を使うことを推奨していることです。また、次のような大文字の「I」で始まるインターフェース名を使用することはお勧めしません。 IBird これは、なぜインターフェイスが必要なのかについて何も語らないものです。つまり、インターフェイスを使って継承階層を構築し、有用であれば抽象クラスを使い、必要であれば具象クラスを実装し、適切であれば委譲を使う、というのが質問の違いです。