技術系

Java基礎 ポリモーフィズム

技術系

こんにちは、なかにしです。

今回は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!!

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