読者です 読者をやめる 読者になる 読者になる

可変長固定長

IT関係の話題が中心

ポリモーフィズムを優しく解説します

java

ポリモーフィズムについて、やさしく解説してみます。
 
ポリモーフィズムオブジェクト指向において必ずといっていいほどに重要になってくる概念です。ポリモーフィズムを実装することにより、再利用性が高まり、プログラムの効率も良くなります。

 

 

 

目次

 

 


ポリモーフィズムとは?

ポリモーフィズムとは継承したサブクラスによって異なる動作を実装する仕組みです。複数のインスタンスで同じメソッドを呼び出し、それぞれに合った実装を呼び出すことができます。

 

例えば作業員クラス(Workerクラス)を考えてみます。スーパークラスWorkerを継承したプログラマークラス(Programerクラス)とデザイナークラス(Designerクラス)があるとします。

 

どちらも仕事(job)というメソッドを持つとして、それぞれ違う動作をさせたいとしましょう。

 

プログラマーはロジックを実装することがjobであり、デザイナーはユーザーインターフェイスを実装することがjobとなります。

 

ここで、継承とオーバーライドの仕組みを使って、スーパークラスのWorkerがもつjobメソッドをプログラマークラスはロジックを実装する内容に、デザイナークラスはユーザーインターフェースを実装する内容にオーバーライドします。


コードで書くとこのような感じです。


abstract class Worker {
abstract void job();
}

 

class Programer extends Worker {
void job() {
//プログラムを書く処理
}
}


class Designer extends Worker {
void job() {
//デザインする処理
}
}
 


ポリモーフィズムの何が便利か

ポリモーフィズムを実現することによりオブジェクト指向における再利用性が高まるのと同時に、サブクラスのメソッドを全く同じ方法で呼び出すことができます。

 

プログラマークラス、デザイナークラスそれぞれの振る舞いを全くおなじ方法で呼び出すことができるようになります。

 
例えば上で書いたProgramerクラスとDesignerクラスを利用する場合、以下のようなコードになります。
 
 
Worker programer = new Programer();
Worker designer = new Designer();

programer.job();
designer.job();
 
 
 
 
もしポリモーフィズムを使わない実装をしたとしたら、プログラマークラス、デザイナークラスそれぞれでメソッドを新規に作成することになります。
 

継承関係がないためオーバーライドする必要がなく、jobメソッドはそれぞれにあった名称をつけることになるかもしれません。例えばプログラマークラスはwriteProgramメソッドに、デザイナークラスはdesignUIメソッドといった形です。
 
 
大きな意味でいうとそれぞれ「仕事をする」という振る舞いであるにもかかわらず、これらのクラスを使う側からしたら呼び出し方法が異なることになります。

 

実生活に置き換えてみましょう。プログラマーには「こういうロジックを書いて」とお願いし、デザイナーには「こういうユーザーインターフェースでデザインして」とお願いする事になります。

 

それぞれ「仕事して」とお願いするだけで、それぞれの持ち場の仕事をしてくれたら指示する側も楽です。

 

また、もしかしたらプログラマークラス、デザイナークラスの他にもマネージャークラスやサポータークラスなんかも必要になってくるかもしれません。


ポリモーフィズムを使っていれば、前述のWorkerクラスを継承してjobメソッドをオーバーライドすれば良いだけです。

 

このようなかたちでサブクラスを作れば、再利用性が高まり、全くおなじ呼び出し方法でそれぞれのクラスの特性にあった振る舞いを実装することができます。
 
 

ポリモーフィズムを実現するためには

ポリモーフィズムを実現するためには、クラスの継承またはインターフェースの実装を行って、共通のメソッドを定義します。ポリモーフィズムでは、同じ型の変数を利用することで、インスタンスが異なっても同じ操作で呼び出しが行えます。

 

同じような振る舞いを考えるタイミングは、クラス設計をする過程でわかります。クラス概念図を眺めてみて、ポリモーフィズムを実装すべきかどうか、ぜひ検討してみてください。