Javaを使っていると継承という言葉をよく耳にしますが、どういうものなのか、いまいちピンとこない人も多いと思います。
今回はJavaの、スーパークラス、サブクラス、そして継承について、詳しく解説していきたいと思います。
スーパークラス、サブクラス、継承とは
たとえば、ものすごい技術を持った、アーティストがいるとします。
そのアーティストの子供は、親を見て、その技術を受け継ぎます。
そして、技は代々受け継がれていきます。
と、いうふうに、プログラミングにおける継承は、親から子へ技が受け継がれていくもの、というイメージを持っておくと、この後の話が分かりやすいと思います。
さて、プログラミングでは、いろんな機能などをまとめるための、クラスという仕組みがあります。
クラスは、とある方法を使うことで、別のクラスの機能などを、受け継ぐことができます。
この、別のクラスの機能などを受け継ぐことを、継承といいます。
また、継承の元になるクラスをスーパークラス(親クラス)、継承して作られたクラスのことをサブクラス(子クラス)、といいます。
継承を使ってみよう
では、実際に継承を使ってみましょう。
例えば、こんな物語があったとします。
主人公は、黒魔術専門の魔術師。
彼には、人々が抱える恨みを代わりに晴らす役目があり、ゆっくりじわじわと時間をかけて、標的を呪いにかける。
彼自身は膨大な額の報酬を受け取るかわりに、自らの命を半分に縮める──
では、今回はこの物語を、プログラムにしていきます。
まず、主人公は「黒魔術師」です。
「黒魔術師(black magician)」なので、つまりは「魔術師(magician)」です。
基本的な魔術は使えますが、それを応用した「黒魔術」を使うことができます。
ではまず、「魔術師(magician)」のクラスを作りましょう。
今回、魔術師のHPは200とし、doMagicメソッドを呼び出すことで、魔法を使うことができるクラスにしました。
public class Magician {
int hp=200;
void doMagic() {
System.out.println("魔法を使った");
}
}
つづいて、「黒魔術師(black magician)」のクラスを作ります。
doBlackMagicメソッドを呼び出すことで、黒魔術を使えますが、引き換えにHPが半分になります。
public class BlackMagician extends Magician {
void doBlackMagic() {
System.out.println("自らのHPを半分に削り、黒魔術を使った");
hp /= 2;
}
}
最初の行をご覧ください。extends
を使って、さきほどのMagician
クラスを継承しています。
これで、BlackMagician
クラスでは、Magician
クラスのメソッドや変数が使えるようになります。
public class Main {
public static void main(String[] args) {
Magician magician = new Magician();
BlackMagician blackMagician = new BlackMagician();
System.out.println(magician.hp); // 出力結果:200
System.out.println(blackMagician.hp); // 出力結果:200
magician.doMagic(); // 出力結果:魔法を使った
blackMagician.doMagic(); // 出力結果:魔法を使った
blackMagician.doBlackMagic(); // 出力結果:自らのHPを半分に削り、黒魔術を使った
System.out.println(magician.hp); // 出力結果:200
System.out.println(blackMagician.hp); // 出力結果:100
magician.doBlackMagic(); // エラー
}
}
上の例では、魔術師(magician)も、黒魔術師(black magician)も、魔法が使えます。
しかし、魔術師は黒魔術(black magic)を使うことができません。
黒魔術師は、黒魔術を使うことができますが、使ったあとにHPを見ると半分に減っているのが分かります。
継承を使う上での注意点(is-a関係について)
継承を使う上での注意点として、全く関係無いクラスを継承することは、よくないとされています。
たとえば、格闘家クラスを継承した黒魔術師クラス、といったものです。
もちろん、継承できない訳ではありませんが、全く関係無いクラスを継承することで、バグの原因になることがあります。
では、どういうクラスなら継承していいのでしょうか。
それを解決するのが、そのクラスに対して、is-a関係にあるか、という考え方です。
学校で、「This is a pen.」という英文を習ったかと思いますが、この「is a」のことです。
今回の場合、「黒魔術師 is a 魔術師」という関係が成り立ちます。
そのためこれは、継承しても問題がない、といえます。
逆に、「黒魔術師 is a 格闘家」というのは、関係が成り立っていません。
この場合は、継承を避けることで、バグを防ぐことができます。
まとめ
継承は、他のクラスの能力を受け継いだクラスを作ることができるものです。
継承の元になるクラスをスーパークラス(親クラス)、継承して作られたクラスのことをサブクラス(子クラス)、といいます。
とても便利なのですが、なんでもかんでも継承を使ってしまうと、バグの原因となる可能性があります。
そういったことを防ぐため、is-a関係にあるかどうかを考えて、継承を行なうようにしましょう。