ポリモーフィズムとは

同じ名前のメソッドを呼び出した場合でも、呼び出したオブジェクトの種類に応じて異なる処理を行わせることができます。この仕組みをポリモーフィズムといいます。ポリモーフィズムを上手く利用することで、どのオブジェクトからメソッドを呼び出しているのかを意識する必要がなくなり、プログラムをより柔軟に作成できるようになります。ここではオブジェクト指向におけるポリモーフィズムについて解説します。

ポリモーフィズムとは

オブジェクト指向では、同じメソッドを呼び出していても、オブジェクトの種類によって異なる処理が実行されることがあります。このような仕組みをポリモーフィズム(多態性)といいます。

簡単な例を使って説明します。次の例では Product クラスをスーパークラスとし、 Foods クラスと Gadgets クラスをサブクラスとして定義しています。

class Product {
  public void showInfo() {
    System.out.println("製品です");
  }
}

class Foods extends Product {
  public void showInfo() {
    System.out.println("食料品です");
  }
}

class Gadgets extends Product {
  public void showInfo() {
    System.out.println("電化製品です");
  }
}

スーパークラスである Product クラスで定義した showInfo メソッドを、サブクラスの Foods クラスと Gadgets クラスでそれぞれオーバーライドしています。(オーバーライドについては「メソッドのオーバーライド」を参照されてください)。

ここでサブクラスのオブジェクトをサブクラス型の変数に代入するのではなく、スーパークラス型の変数に代入します。このようにスーパークラスの型の変数にサブクラスのオブジェクトを代入することをアップキャストといいます。(次のページで詳しく解説します)。

public class Sample {
  public static void main(String[] args) {
  	// スーパークラスの変数にサブクラスのオブジェクトを代入する
    Product p1 = new Foods();
    Product p2 = new Gadgets();

    p1.showInfo();
    p2.showInfo();
  }
}

このとき、 Foods クラスと Gadgets クラスのオブジェクトがそれぞれ作成されたあとで、そのオブジェクトへの参照が Product 型の変数に代入されています。

そのため Foods クラスのオブジェクトが代入されている変数を使って showInfo メソッドを呼び出すと、 Foods クラスで定義されている showInfo メソッドが呼び出されます。同じように Gadgets クラスのオブジェクトが代入されている変数を使って showInfo メソッドを呼び出すと、 Gadgets クラスで定義されている showInfo メソッドが呼び出されます。

Product p1 = new Foods();
p1.showInfo();
>> 食料品です

Product p2 = new Gadgets();
p2.showInfo();
>> 電化製品です

このように同じメソッドを呼び出していても、実際のオブジェクトの種類によって実行される処理が変わるのがポリモーフィズムです。

ポリモーフィズムのメリット

ポリモーフィズムを利用することで、スーパークラス型の変数でオブジェクトをまとめて扱うことができます。例えば次のように配列を使って複数のオブジェクトを管理することができます。

Product[] list = new Product[2];

list[0] = new Foods();
list[1] = new Gadgets();

for (Product p : list) {
  p.showInfo();
}

この場合、配列の型は Product 型ですが、実際には異なる種類のオブジェクトを格納しています。それぞれのオブジェクトに対して同じメソッドを呼び出すだけで、適切な処理が実行されます。また今後オブジェクトの数が増えても for 文の部分を修正する必要はありません。

もしポリモーフィズムを使用しない場合、次のように一つ一つメソッドを呼び出す必要があります。今回のようにオブジェクトが 2 つであればいいですが、多くのオブジェクトを扱う場合は大変です。

Foods f = new Foods();
Gadgets g = new Gadgets();
 
f.showInfo();
g.showInfo();

このようにポリモーフィズムを利用することで、プログラムを柔軟に設計することができるようになります。

サンプルコード

では簡単なサンプルを作って試してみます。テキストエディタで次のように記述したあと、 Sample.java という名前で保存します。

public class Sample {
  public static void main(String[] args) {
    Product[] list = new Product[2];

    list[0] = new Foods();
    list[1] = new Gadgets();

    for (Product p : list) {
      p.showInfo();
    }
  }
}

class Product {
  public void showInfo() {
    System.out.println("製品です");
  }
}

class Foods extends Product {
  public void showInfo() {
    System.out.println("食料品です");
  }
}

class Gadgets extends Product {
  public void showInfo() {
    System.out.println("電化製品です");
  }
}

コンパイルを行います。

javac -encoding UTF-8 Sample.java

その後で、次のように実行してください。

java Sample

ポリモーフィズムとは(1)

異なるサブクラスのオブジェクトから同じ名前のメソッドを呼び出し、それぞれ異なる処理が行われていることを確認できました。

-- --

オブジェクト指向におけるポリモーフィズムについて解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。