「こんにちは、アミーゴ! ついに本当に興味深いものにたどり着きました。今日は多重継承についてお話します。多重継承は確かに非常に魅力的で強力なツールです。いくつかの問題がなければ、Java は役に立ちます。」はクラスの多重継承をサポートします。しかし、そうではないので、インターフェースの多重継承に満足する必要があります。これも非常に素晴らしいことです。」

複数のインターフェースの継承 - 1

あなたがコンピューター ゲームを書いていると想像してください。そして、そのキャラクター (オブジェクト) は非常に複雑な方法で行動する必要があります。マップ上を歩き回り、アイテムを収集し、クエストを実行し、他のキャラクターとコミュニケーションをとり、誰かを殺し、誰かを救います。すべてのオブジェクトを 20 のカテゴリに分類できたとします。これは、運が良ければ、オブジェクトを定義するのに 20 クラスだけで済むことを意味します。しかし、ここに問題があります。これらのオブジェクトには、相互作用の独自の形式がいくつあるでしょうか? 各タイプのオブジェクトは、他の 20 タイプのオブジェクトと独自の相互作用を持つことができます (同じタイプのオブジェクトとの相互作用もカウントしています)。言い換えれば、20 x 20 = 400 回のインタラクション用のコードを記述する必要があります。また、一意のオブジェクト タイプの数が 20 ではなく 100 であれば、インタラクションの数は 10,000 になる可能性があります。

「おお!プログラミングがなぜこんなに難しい作業なのか理解できました。」

「シンプルです。多くの抽象化のおかげです。そして、インターフェイスの多重継承のおかげでもあります。」

オブジェクト自体ではなく、役割や能力が相互作用する場合、オブジェクトの相互作用を単純化できることがよくあります。そして、すでにご存知のとおり、クラスが何らかのインターフェイスを実装する場合、クラスに能力を簡単に追加できます。

大規模なプログラムを作成する場合、開発者は通常、最初から次の作業を行います。

1)すべての能力/役割を特定します。

2)これらの役割間の相互作用を定義します。

3)次に、すべてのクラスに役割を割り当てます。

「例としては?」

「もちろんです。漫画『トムとジェリー』の役割を見てみましょう。」

Javaコード 説明
interface Moveable
{}
— 役割/移動能力。
interface Eatable
{}
— 食べられる役割・能力。
interface Eat
{}
— 人を食べる役割・能力。
class Tom extends Cat implements Moveable, Eatable, Eat
{}
トムは 3 つの役割を持つ猫です:
1) 動ける
2) 誰かを食べることができる
3) 誰か (犬) に食べられる
class Jerry extends Mouse implements Moveable, Eatable
{}
ジェリーは 2 つの役割を持つネズミです:
1) 動ける
2) 誰かに食べられる
class Killer extends Dog implements Moveable, Eat
{}
キラーは 2 つの役割を持つ犬です: 1) 動くことができる 2) 人を食べることができる

これら 3 つの役割 (インターフェース) だけを知っていれば、プログラムを作成し、これらの役割間の正しい相互作用を記述することができます。たとえば、オブジェクトは (Movable インターフェイスを介して) «食べられるもの» を追いかけ、«食べられるもの» から逃げます。そしてこれらすべては、特定のオブジェクトについて知ることなく行われます。プログラムにさらにオブジェクト (クラス) を追加し、これらの役割を維持した場合でも、プログラムは引き続き美しく動作し、オブジェクトの動作を制御します。