夢の国でポリモーフィズムについて考える ~Java初心者の備忘録~

プログラミング
この記事は約5分で読めます。

こんにちはペンすけです!
突然ですが、

ペンすけ
ペンすけ

夢の国ってポリモーフィズムで溢れてるじゃん!

と、感じることが多いので、 Javaのポリモーフィズム(多態性) について整理していきます!

ポリモーフィズムは簡単3ステップ!

今回もアトラクションを例にとって説明していきます!

0. 想定している状況

全てのアトラクションは、次の3種類に分類されているとします。

– 優先パス対象-

主に人気アトラクションが対象。

専用のアプリでパスを取得した来園者は、少ない待ち時間で体験が可能。

– 当選者専用 –

抽選で当選した来園者のみ体験可能なアトラクション。

専用のアプリで抽選をすることで、体験のチャンスが掴める。

– 通常アトラクション-

全ての来園者が体験可能なアトラクション。

1. 属性と機能の関係から、親クラスと子クラスを作る

想定している状況を基に、3つのクラスを作成しました。

ペンすけ
ペンすけ

3つのクラスで共通して同じ属性を持っているね。

メソッドも、基本情報の表示が共通しているね。

異なるクラスで共通する属性やメソッドがある
ということは…

ペンすけ
ペンすけ

抽象化!アブストラクトクラスの定義!!!

抽象クラスを定義することによって、差分コーディングが可能となりました!
共通して持つ属性や、メソッドを抽象クラスに持ってもらうことで、継承先では独自の属性やメソッドを定義するのみでOKとなります!

2. 表示させたい内容を考える

----------------------------------------
アトラクション名: 絶叫バイキング
エリア名: パイレーツエリア
待ち時間: 35分

----------------------------------------
アトラクション名: サンダーマウンテン
エリア名: トゥモローエリア
待ち時間: 75分
* 注記:優先パス対象のアトラクションです

----------------------------------------
アトラクション名: ハッピーカルーセル
エリア名: トゥモローエリア
待ち時間: 10分
* 注記:当選者専用のアトラクションです。

上記の出力では、「アトラクション名」「エリア名」「待ち時間」は共通させた上で、
優先パス対象アトラクションと当選者専用アトラクションは、注記を表示させたいです。

ペンすけ
ペンすけ

継承先では、抽象クラス(親クラス)のメソッドを super を使って呼び出すことができるんだね!

3. 子クラスで親クラスのメソッド名を上書き(@Override)

ペンすけ
ペンすけ

ここで1つポイント!

継承先クラスで、抽象クラスのメソッド名を上書き(オーバーライド)することで、ポリモーフィズムが実現できるよ!

実際のコーディング

// 抽象クラス(アトラクションクラス)
public void printInfo(){
    System.out.println("\n----------------------------------------");
    System.out.println("アトラクション名: " + name);
    System.out.println("エリア名: " + area);
    System.out.println("待ち時間: " + waitTime + "分");
}

// 優先パス対象アトラクション
@Override
public void printInfo(){
    super.printInfo();
    System.out.println("* 注記:優先パス対象のアトラクションです");
}

// 当選者専用アトラクション
@Override
public void printInfo(){
    super.printInfo();
    System.out.println("* 注記:当選者専用のアトラクションです。");
}

// 通常アトラクション
// 特にprintInfo()の記載必要なし

// メインクラス(出力)
class Main{
    public static void main(String[] args){

        NormalAttraction biking = new NormalAttraction("絶叫バイキング", "パイレーツエリア", 35);
        FirstAttraction thunder = new FirstAttraction("サンダーマウンテン", "トゥモローエリア", 75);
        PremiereAttraction happy = new PremiereAttraction("ハッピーカルーセル", "トゥモローエリア", 10);

        // 通常アトラクション
        biking.printInfo();

        // 優先パス対象
        thunder.printInfo();

        // 当選者専用
        happy.printInfo();
        
    }
}
----------------------------------------
アトラクション名: 絶叫バイキング
エリア名: パイレーツエリア
待ち時間: 35分

----------------------------------------
アトラクション名: サンダーマウンテン
エリア名: トゥモローエリア
待ち時間: 75分
* 注記:優先パス対象のアトラクションです

----------------------------------------
アトラクション名: ハッピーカルーセル
エリア名: トゥモローエリア
待ち時間: 10分
* 注記:当選者専用のアトラクションです。

ソースコードの全貌はこちらから!

コメント

タイトルとURLをコピーしました