広告 プログラム

ポリモーフィズムとは

ポリモーフィズム(多態性)

ポリモーフィズム(英:Polymorphism)とは、オブジェクト指向の考え方の一つで、ある1つの関数(メソッド)の呼び出しに対し、オブジェクト毎に異なる動作をすることをいいます。

同じ関数なのに違う動きをする?イメージが湧かない・・・
異なる動作を同じ処理で実現するのがポリモーフィズムです。

それでは、もう少し具体的に見ていきましょう。

スポンサーリンク

ポリモーフィズムのイメージ例

例えば、動物クラスに「cry」(鳴く)という関数(メソッド)があるとします。

そして、動物クラスのサブクラスには 犬クラス、ネコクラス、豚クラスがあり、それぞれ「cry」(鳴く)という関数(メソッド)の中身を独自で実装しています。

ポリモーフィズムとは

その結果、動物クラスの「cry」(鳴く)を実行すると、犬クラスのオブジェクトは「わん」、猫クラスのオブジェクトは「にゃー」、豚クラスのオブジェクトは「ブーブー」と鳴きます。

このように、呼び出し側は同じ「cry」(鳴く)という処理を実行しているが、命令を受け取ったオブジェクト側でそれぞれ異なる動作をするのがポリモーフィズムです。

ポリモーフィズムの実装例

それでは具体的にポリモーフィズムの実装例(Java言語)を紹介します。

■動物インタフェース(IAnimal.java)

package main.animal;

/**
 * 動物のインタフェース
 */
public interface IAnimal {

    /**
     * 鳴く
     */
    void cry();
}

■動物インタフェースをimplementsした犬クラス(Dog.java)

package main.animal;

/**
 * 犬クラス
 */
public class Dog implements IAnimal {

    /**
     * 鳴く
     */
    @Override
    public void cry() {
        System.out.println("わん");
    }
}

■動物インタフェースをimplementsした猫クラス(Cat.java)

package main.animal;

/**
 * 猫クラス
 */
public class Cat implements IAnimal {

    /**
     * 鳴く
     */
    @Override
    public void cry() {
        System.out.println("にゃー");
    }
}

■動物インタフェースをimplementsした豚クラス(Pig.java)

package main.animal;

/**
 * 豚クラス
 */
public class Pig implements IAnimal {

    /**
     * 鳴く
     */
    @Override
    public void cry() {
        System.out.println("ブーブー");
    }
}

■mainクラス(AnimalStart.java)

package main.animal;

/**
 * 動物クラスの実行
 */
public class AnimalStart {

    public static void main(String[] args) {

        // 猫クラスの実行
        IAnimal cat = new Cat();
        cat.cry();

        // 犬クラスの実行
        IAnimal dog = new Dog();
        dog.cry();

        // 豚クラスの実行
        IAnimal pig = new Pig();
        pig.cry();
    }
}

【実行結果】

にゃー
わん
ブーブー

動物インタフェースには、「cry」(鳴く)というメソッドを用意し、動物インタフェースをimplementsした「犬クラス」「猫クラス」「豚クラス」で「cry」(鳴く)の中身を実装しています。

その結果、呼び出し側は同じ「cry」(鳴く)という処理を実行しているが、命令を受け取ったオブジェクト側でそれぞれ異なる動作(犬クラスの場合は「わん」、猫クラスの場合は「にゃー」、豚クラスの場合は「ブーブー」と出力している)をしています。

なるほど、「同じ関数なのに違う動きをする」ってこういうことだったんですね。

helpful