「こんにちは、アミーゴ! ついに本当に興味深いものにたどり着きました。今日は多重継承についてお話します。多重継承は確かに非常に魅力的で強力なツールです。いくつかの問題がなければ、Java は役に立ちます。」はクラスの多重継承をサポートします。しかし、そうではないので、インターフェースの多重継承に満足する必要があります。これも非常に素晴らしいことです。」
あなたがコンピューター ゲームを書いていると想像してください。そして、そのキャラクター (オブジェクト) は非常に複雑な方法で行動する必要があります。マップ上を歩き回り、アイテムを収集し、クエストを実行し、他のキャラクターとコミュニケーションをとり、誰かを殺し、誰かを救います。すべてのオブジェクトを 20 のカテゴリに分類できたとします。これは、運が良ければ、オブジェクトを定義するのに 20 クラスだけで済むことを意味します。しかし、ここに問題があります。これらのオブジェクトには、相互作用の独自の形式がいくつあるでしょうか? 各タイプのオブジェクトは、他の 20 タイプのオブジェクトと独自の相互作用を持つことができます (同じタイプのオブジェクトとの相互作用もカウントしています)。言い換えれば、20 x 20 = 400 回のインタラクション用のコードを記述する必要があります。また、一意のオブジェクト タイプの数が 20 ではなく 100 であれば、インタラクションの数は 10,000 になる可能性があります。
「おお!プログラミングがなぜこんなに難しい作業なのか理解できました。」
「シンプルです。多くの抽象化のおかげです。そして、インターフェイスの多重継承のおかげでもあります。」
オブジェクト自体ではなく、役割や能力が相互作用する場合、オブジェクトの相互作用を単純化できることがよくあります。そして、すでにご存知のとおり、クラスが何らかのインターフェイスを実装する場合、クラスに能力を簡単に追加できます。
大規模なプログラムを作成する場合、開発者は通常、最初から次の作業を行います。
1)すべての能力/役割を特定します。
2)これらの役割間の相互作用を定義します。
3)次に、すべてのクラスに役割を割り当てます。
「例としては?」
「もちろんです。漫画『トムとジェリー』の役割を見てみましょう。」
Javaコード | 説明 |
---|---|
|
— 役割/移動能力。 |
|
— 食べられる役割・能力。 |
|
— 人を食べる役割・能力。 |
|
トムは 3 つの役割を持つ猫です: 1) 動ける 2) 誰かを食べることができる 3) 誰か (犬) に食べられる |
|
ジェリーは 2 つの役割を持つネズミです: 1) 動ける 2) 誰かに食べられる |
|
キラーは 2 つの役割を持つ犬です: 1) 動くことができる 2) 人を食べることができる |
これら 3 つの役割 (インターフェース) だけを知っていれば、プログラムを作成し、これらの役割間の正しい相互作用を記述することができます。たとえば、オブジェクトは (Movable インターフェイスを介して) «食べられるもの» を追いかけ、«食べられるもの» から逃げます。そしてこれらすべては、特定のオブジェクトについて知ることなく行われます。プログラムにさらにオブジェクト (クラス) を追加し、これらの役割を維持した場合でも、プログラムは引き続き美しく動作し、オブジェクトの動作を制御します。
GO TO FULL VERSION