継承は、オブジェクト指向プログラミング(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!!");
}
}
Overrideアノテーションは、サブクラスのメソッドがスーパークラスのメソッドをオーバーライドしていることを示すために使います。
必ず必要なものではありませんが、使うのがベストプラクティスです。
では、次のように書くとどうなるでしょうか。
Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();
注:AnimalクラスをLionで初期化しています。
出力は次のようになります。
Lion here!!
オブジェクト指向プログラミングでは、継承には多くの種類がありますが、Javaがサポートしているのはその一部だけです(マルチレベル継承と階層継承)。 詳しくは、こちらをご覧ください。
この演習では、いろいろなタイプのファイターが互いに戦うロールプレイングゲームをプレイします。 ゲームには、ファイターのタイプごとに異なるルールがあります。 ここでは、WizardとWarriorという2つのタイプに注目します。
Warriorのルールは次のとおりです。
6ポイントのダメージを与えます。10ポイントのダメージを与えます。Wizardのルールは次のとおりです。
12ポイントのダメージを与えます。3ポイントのダメージを与えます。Warriorという新しいクラスを作成します。
このクラスは、既存のFighterクラスを継承するようにします。
Warriorクラスを更新して、toString()メソッドがどんなタイプのファイターなのかを説明するようにします。
このメソッドは文字列"Fighter is a Warrior"を返すようにします。
Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"
Warriorクラスを更新して、isVulnerable()メソッドが常にfalseを返すようにします。
Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false
Warriorクラスを更新して、getDamagePoints(Fighter)メソッドが、上記のルールにしたがってWarriorが与えるダメージを計算するようにします。
Warrior warrior = new Warrior();
Wizard wizard = new Wizard();
warrior.getDamagePoints(wizard);
// => 10
Wizardという新しいクラスをもう1つ作成します。
このクラスも、既存のFighterクラスを継承するようにします。
Wizardクラスを更新して、toString()メソッドがどんなタイプのファイターなのかを説明するようにします。
このメソッドは文字列"Fighter is a Wizard"を返すようにします。
Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"
Wizardクラスを更新して、prepareSpell()というメソッドを追加します。
このクラスは、このメソッドが呼び出されたことを覚えておき、呪文が準備されているときだけisVulnerable()メソッドがfalseを返すようにします。
Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false
Wizardクラスを更新して、getDamagePoints(Fighter)メソッドが、上記のルールにしたがってWizardが与えるダメージを計算するようにします。
Wizard wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12