トラック
/
Java
Java
/
演習
/
魔法使いと戦士
魔法使いと戦士

魔法使いと戦士

学習演習

はじめに

継承

継承は、オブジェクト指向プログラミング(OOP)の中心となる概念です。 継承はIS-A関係を表します。 英語で「継承」という言葉が持つ意味は、プログラミングでもそのまま当てはまります。つまり、親から機能を受け継ぐということです(プログラミングでは、機能といえば通常は関数と変数のことです)。

次のようなAnimalクラスを考えてみましょう。

//Creating an Animal class with bark() as a member function.
public class Animal {

    public void bark() {
        System.out.println("This is an animal");
    }

}

Animalは親クラスです。このクラスが持つ性質は、一般的なすべての動物に拡張できるからです。

Lionという動物を考えてみましょう。そのクラスは次のようになります。

//Lion class is a child class of Animal.
public class Lion extends Animal {

    @Override
    public void bark() {
        System.out.println("Lion here!!");
    }

}
Note

Overrideアノテーションは、サブクラスのメソッドがスーパークラスのメソッドをオーバーライドしていることを示すために使います。 必ず必要なものではありませんが、使うのがベストプラクティスです。

では、次のように書くとどうなるでしょうか。

Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();

注:AnimalクラスをLionで初期化しています。 出力は次のようになります。

Lion here!!

オブジェクト指向プログラミングでは、継承には多くの種類がありますが、Javaがサポートしているのはその一部だけです(マルチレベル継承と階層継承)。 詳しくは、こちらをご覧ください。

説明

この演習では、いろいろなタイプのファイターが互いに戦うロールプレイングゲームをプレイします。 ゲームには、ファイターのタイプごとに異なるルールがあります。 ここでは、WizardとWarriorという2つのタイプに注目します。

Warriorのルールは次のとおりです。

  • Warriorは決して脆弱になりません。
  • 攻撃する相手が脆弱でなければ、Warriorは6ポイントのダメージを与えます。
  • 攻撃する相手が脆弱であれば、Warriorは10ポイントのダメージを与えます。

Wizardのルールは次のとおりです。

  • Wizardは事前に呪文を準備できます。
  • 事前に呪文を準備していないかぎり、Wizardは脆弱になります。
  • 事前に呪文を準備していれば、Wizardは12ポイントのダメージを与えます。
  • 事前に呪文を準備していなければ、Wizardは3ポイントのダメージを与えます。

1. Warriorクラスを作成する

Warriorという新しいクラスを作成します。 このクラスは、既存のFighterクラスを継承するようにします。

2. Warriorを説明する

Warriorクラスを更新して、toString()メソッドがどんなタイプのファイターなのかを説明するようにします。 このメソッドは文字列"Fighter is a Warrior"を返すようにします。

Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"

3. Warriorを脆弱でなくする

Warriorクラスを更新して、isVulnerable()メソッドが常にfalseを返すようにします。

Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false

4. Warriorのダメージポイントを計算する

Warriorクラスを更新して、getDamagePoints(Fighter)メソッドが、上記のルールにしたがってWarriorが与えるダメージを計算するようにします。

Warrior warrior = new Warrior();
Wizard wizard = new Wizard();

warrior.getDamagePoints(wizard);
// => 10

5. Wizardクラスを作成する

Wizardという新しいクラスをもう1つ作成します。 このクラスも、既存のFighterクラスを継承するようにします。

6. Wizardを説明する

Wizardクラスを更新して、toString()メソッドがどんなタイプのファイターなのかを説明するようにします。 このメソッドは文字列"Fighter is a Wizard"を返すようにします。

Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"

7. Wizardが呪文を準備できるようにし、準備していないときは脆弱にする

Wizardクラスを更新して、prepareSpell()というメソッドを追加します。 このクラスは、このメソッドが呼び出されたことを覚えておき、呪文が準備されているときだけisVulnerable()メソッドがfalseを返すようにします。

Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false

8. Wizardのダメージポイントを計算する

Wizardクラスを更新して、getDamagePoints(Fighter)メソッドが、上記のルールにしたがってWizardが与えるダメージを計算するようにします。

Wizard wizard = new Wizard();
Warrior warrior = new Warrior();

wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Java Exercism

魔法使いと戦士を始める準備はできましたか?

Exercismに登録すれば、26個のコンセプト158個の演習、そして本物の人間によるメンタリングとともに、Javaを学んでマスターできます。すべて無料です。