こんにちはペンすけです!
突然ですが、
ペンすけ
夢の国ってポリモーフィズムで溢れてるじゃん!
と、感じることが多いので、 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分
* 注記:当選者専用のアトラクションです。
ソースコードの全貌はこちらから!
コメント