4-補充: 抽象クラスとインターフェイスのサンプル


・ 基本課題のクラス間の継承関係は次の図のように考えることができます。 Creatureを「攻撃的」な性質を持つ Attackerとそうでないクラスとに 最初に2分しています。 継承はすべて単純な関係で、クラスの親子関係だけで記述できます。

fig1

この考え方はわかりやすい反面、柔軟性に欠ける部分もあります。 たとえば Humanのクラスの全てが「攻撃的」な性質も持つのではなく、 「攻撃的」なサブクラス Soldierのみが Attackerとして振る舞うように したいとしましょう。 Javaでは2個以上の通常のクラスを同時に継承することはできません。 したがって Soldierのスーパクラス Human が実装を持つのであれば Attackerはインターフェイスとして記述しなくてはいけません。

・ Attackerは Creatureを継承し、それに「攻撃的」な機能である attack()メソッド を追加したものでした。これらの機能を分離することから考えてみましょう。 Creatureとしての性質である「ここを識別する名前を持つ」、「生命力を持つ」 という機能を定義するインターフェイス Lifeと、 攻撃を行なう機能 Attackableを定義します。
Attackableの機能を分離したことで Lifeのサブクラスと「攻撃能力」とは 独立した概念として取り扱うことが可能となります。

fig1

・ 今回のサンプルでは、生命体どおしが攻撃し合うゲームを目指しています。 したがって Attackerは攻撃を行なう Attackableであると同時に、 攻撃対象の Lifeでもあります。 したがって Attackerインターフェイスはこの両者を継承 します。 通常は Attackableを通じて処理を行なえばよいのですが、 Battelクラスの中では生命力や個体名を調べる必要があるので Attackerインターフェイスが必要です。
Soldierは Humanのサブクラスであると同時に Attackerを実装します。 この場合、Lifeとしての性質が2重に継承されることになりますが、 実装を持つのは Humanを通じての方だけなので混乱生じません。

・ ソースのまとめ: