ポリモーフィズムでつまずいてた過去

はじめに

今月から新しいプロジェクトへ。使用言語は新人研修以来の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(); // 「絶妙なコースにスライダーを投げた!」
  }
}
--------------------------
開発支援・技術研修のご要望・ご相談はこちらから
--------------------------
【この技術ブログを読んだエンジニアの皆様へ】
カサレアルブログをお読みいただき、ありがとうございます!

私たちは、常に新しい技術に挑戦し、ユーザーのニーズに応えるサービスを提供しています。
もし、当社の技術への情熱や、会社・チーム・社員の雰囲気に共感いただけたなら、
ぜひ私たちと一緒に働きませんか?
現在、株式会社カサレアルでは事業拡大に伴い、新たな仲間となるエンジニアを積極的に募集しています。

少しでも興味をお持ちいただけましたら、まずは弊社のことを知っていただけると嬉しいです。
▼採用サイト
https://www.casareal.co.jp/recruit/career
▼社員インタビュー
https://hrmos.co/pages/casareal/jobs/0000016
▼エンジニアの仲間になる! エントリーはこちらから
https://hrmos.co/pages/casareal/jobs

皆様のエントリーを心よりお待ちしています!

AIを使って既存コードからテストケースを自動生成

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

コメント ※

名前 ※

メール ※

サイト