こんにちは、なかにしです。
今回はJavaのポリモーフィズムについてまとめます。
便利な考え方なので、ぜひご覧ください🙌
ポリモーフィズムとは
言語化が難しすぎるので、実際のコードをベースに説明します。
文章の説明としてはこちらが分かりやすいと思います。
一言で言うと、「共通部分をまとめて、必要に応じてカスタマイズしようぜ!」な考え方です。
コードで実践
今回は「楽器」を例に出して説明します。
まずは以下の「ギター」「ピアノ」「シンバル」クラスをご覧ください。
public class Guitar{
void play(){
System.out.println("Guiterの音");
}
void stop(){
System.out.println("演奏ストップ");
}
}
public class Piano{
void play(){
System.out.println("Pianoの音");
}
void stop(){
System.out.println("演奏ストップ");
}
}
public class Cymbal{
void play(){
System.out.println("Cymbalの音");
}
void stop(){
System.out.println("演奏ストップ");
}
}
これをMainで呼びます。
import java.util.*;
public class Main {
public static void main(String[] args){
// インスタンスを作成
Guitar guitar = new Guitar();
Piano piano = new Piano();
Cymbal cymbal = new Cymbal();
// guitarのメソッド呼び出し
guitar.play();
guitar.stop();
// pianoのメソッド呼び出し
piano.play();
piano.stop();
// cymbalのメソッド呼び出し
cymbal.play();
cymbal.stop();
}
}
▽結果
ここからポリモーフィズムに則り、
共通部分を「Gakki」クラスにまとめていきます。
共通部分は、playとstopメソッドですね。
stop()に関しては中身も一緒なので、まとめます。
public class Gakki{
void play(){}
void stop(){
System.out.println("演奏ストップ");
}
}
そしてこのGakkiクラスを使用して、他のクラスを書き換えます。
stopメソッドは書き換えが不要なので、playメソッドのみオーバーライドします。
public class Guitar extends Gakki{
void play(){
System.out.println("Guiterの音");
}
}
public class Piano extends Gakki{
void play(){
System.out.println("Pianoの音");
}
}
public class Cymbal extends Gakki{
void play(){
System.out.println("Cymbalの音");
}
}
継承を使用しているので、すべてのクラスでGakki型を使用可能です。
Mainを書き換えます。
import java.util.*;
public class Main {
public static void main(String[] args){
// インスタンスを作成
Gakki guitar = new Guitar();
Gakki piano = new Piano();
Gakki cymbal = new Cymbal();
// guitarのメソッド呼び出し
guitar.play();
guitar.stop();
// pianoのメソッド呼び出し
piano.play();
piano.stop();
// cymbalのメソッド呼び出し
cymbal.play();
cymbal.stop();
}
}
結構見やすくなりました。
同じ「Gakki型」で受け取っているので、配列を使用してもっと簡略化できます。
import java.util.*;
public class Main {
public static void main(String[] args){
// インスタンスをリストで一括作成
Gakki[] lists = { new Guitar(), new Piano(), new Cymbal() };
// メソッドを拡張for文で呼び出し
for(Gakki list: lists){
list.play();
list.stop();
};
}
}
▽結果
めっちゃコード量が減りましたね。
共通部分を抜き出して別クラスとして管理、
継承を利用してそのクラスを拡張して適時カスタマイズする。
これがポリモーフィズムです。
さいごに
いかがでしたでしょうか。
コードで見ると、かなり量が減って見やすくなっていることが分かりますね。
まとめられる所はまとめる、という考え方は
昔からずっと受け継がれてきたんですね。感慨深い。
今回はここまで!
Enjoy Hacking!!