こんにちは、なかにしです。
今回は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!!



