前回は抽象クラスやインタフェースを用いて、現実世界にあるあいまいな物事をJavaのコードとして表現できることを学びました。 ここでは、Javaの仮想世界でも物事をあいまいに捉えるための機能である多様性について説明します。 多様性はオブジェクト指向プログラミングを支える3大機能の1つで、多様性やポリモーフィズムと呼ばれます。これを上手に活用することで、とても効率よく 楽しく開発を行うことができるようになります。まずは、多様性のイメージを持つことから始めてみましょう。多様性のイメージは「あるものを、あえてざっくり捉える」ことで、様々なメリットを享受しようという機能であるといった ざっくりとしたイメージで大丈夫です。では、ざっくり捉えることのメリットは何でしょうか。これは私たちの日常生活にも多く見ることができます。 例えば、レンタカーを借りて車を運転するときのことを考えてください。厳密にいえば、初めて乗る車ですが、多くの人が問題なく運転できます。 これは、ドライバーの「ハンドルは同じだし、右ペダルがアクセル、左がブレーキ。細かいところはあれこれ違うけど、ざっくり見れば、どの車も同じだよ」という考えからきています。 このように、私たちが現実世界で楽するためにざっくりととらえる方法をプログラムでも実現する機能こそ、多様性なのです。 しかし、多様性をプログラムに落とし込む何か専用の文法があるわけではありません。実は今まで何度も用いてきた「代入の文法」を使えば、ざっくりと捉えることができるようになっています。 例を見てみましょう。
Character c = new SuperHero();
ここまでは、どのようにしてざっくり捉えるかを説明していきました。ここでは、ざっくりと捉えた時と厳密に捉えた時の違いについて説明していきます。 何かを利用する人は、それを何と捉えているかによって、利用方法が変わります。あいまいで抽象的なほど用途は限定され、具体的に捉えるほど用途が増えていきます。 これはJavaの仮想世界でもちゃんと再現されます。ここでは、CharacterとWizardを例にとって説明していきます。
public abstract class Character{
String name;
int hp;
public void run(){}
public abstract void attack(Matango m);
}
public class Wizard extends Character{
int mp;
public void attack(Motango m){
}
public void fireball(Motango m){
}
}
public class Main{
public static void main(String[] args){
Wizard w = new Wizard();
Matango m = new Matango();
w.name = "アサカ";
w.attack(m);
w.fireball(m);
}
}
Character c = new Wizard();
Wizard w = (Wizard)c;
if (c instanceof SuperHero){
SuperHero h = (SuperHero)c;
h.fly();
}