
ポリモーフィズムでつまずいてた過去
はじめに
今月から新しいプロジェクトへ。使用言語は新人研修以来のJava。社会人になって初めてプログラミングに触れたあの頃。毎日が新しい体験の連続で、コードが動くたびにワクワクしていました。しかし、学習が進むにつれ立ちはだかる高い壁、、、。特に「ポリモーフィズム」あたりからは、チンプンカンプンだった苦い記憶があります。
3年目になってある程度説明できるようになった今、もう少しで新しい年度が始まるということもあり、初学者向けにポリモーフィズムについて説明したいと思います。
ポリモーフィズムとは
ポリモーフィズムとは日本語で多様性・多態性などと訳されることが多いです。「形が多岐にわたる」ということですが、これだけ聞いても「?」です。
ひとことで言うなら、「相手が誰であれ、同じ命令(メソッド)を送れば、それぞれが適切な動きをしてくれる仕組み」のことです。
私は野球が好きなので野球ゲームのピッチャーで例えましょう。
ポリモーフィズムを使わない場合
もし投手Aならばストレートは150km/hの剛速球を投げる処理
もし投手Bならば多彩な変化球を投げる処理
もし投手Cならば変則的なフォームで投げる処理
もし投手Dなら~、もし投手Eなら~,,,
投手に合わせて命令を使い分けなければなりません。
しかし、ポリモーフィズムを使うと、共通の「投げる」という命令ひとつで済みます。
投げろ!と命令するだけで
投手Aがマウンドにいれば自動的に剛速球を投げる
投手Bがマウンドにいれば自動的に変化球を投げる
投手Cがマウンドにいれば自動的に変則的に投げる
「命令する側(呼び出し元)」は投手が誰か細かく気にしなくていい。 これが最大のメリット。
サンプルコード
上記の例をコードで考えてみましょう。
①共通ルール
// ピッチャーとしての共通ルール
interface Pitcher {
void throwBall(); // 「投げる」というアクションだけ決めておく
}
②具体的な”実装”
// 投手Aクラス
class ToushuA implements Pitcher {
@Override
public void throwBall() {
System.out.println("150kmのストレートを投げた!");
}
}
// 投手Bクラス
class ToushuB implements Pitcher {
@Override
public void throwBall() {
System.out.println("絶妙なコースにスライダーを投げた!");
}
}
// 投手Cクラス
class ToushuC implements Pitcher {
@Override
public void throwBall() {
System.out.println("出元が分かりにくいストレートを投げた!");
}
}③実際に扱う!
ここが一番のポイントになります。
public class BaseballGame {
public static void main(String[] args) {
// マウンドに立つ人を、投手Aにする(Pitcher型として扱う)
Pitcher moundPitcher = new ToushuA();
// ボタンが押された時の処理
// Pitcherなら必ずthrowBall()を持っていることが保証されている
moundPitcher.throwBall(); // 「150kmのストレートを投げた!」
// 選手交代!
moundPitcher = new ToushuB();
moundPitcher.throwBall(); // 「絶妙なコースにスライダーを投げた!」
}
}