
多様性とは?
重複コードを排除するための仕組みの一つです。
メリット
構造化プログラミング時代風に言えば、「共通メインルーチン」を作るための仕組みになります。
共通サブルーチンであれば、呼び出す側が変更になっても呼び出される側を修正する必要はないですが、共通メインルーチンであれば、呼び出される側が変更になっても、呼び出す側を変更する必要がなくなるという意味になります。
フレームワークや、クラスライブラリなどの大規模な再利用部品もポリモーフィズムがあったから導入可能になりました。
例
呼び出される側
継承元クラス
1 2 3 4 5 |
class FileReader { public void open () {}; public void close () {}; } |
継承先クラス1
1 2 3 4 5 |
class TextFileReader extend FileReader { public void open () { 具体的な実装}; public void close () {具体的な実装}; } |
継承先クラス2
1 2 3 4 5 |
class JsonFileReader extend FileReader { public void open () { 具体的な実装}; public void close () {具体的な実装}; } |
呼び出す側
引数に親クラスを指定すれば、呼び出し元のメソッドは変える必要がなくなる。(共通化される。)
1 2 3 |
public void getFile (FileReader reader) { 処理 } |
この例では「FileReader」を継承した「TextFileReader」、「JsonFileReader」というクラスを作っていますが、仮に今後「CsvFileReader」、「TsvFileReader」という呼び出される側のクラスが増えていったとしても呼び出す側は一切手を加える必要がなくなります。
呼び出される側を共通化する仕組みは元々オブジェクト指向の前の時代からありましたが、オブジェクト指向プログラミングの登場によって呼び出す側のプログラムを共通化することが可能になりました。
ただ、実際のところ具象クラスを継承させて新たな具象クラスを作るというようなパターンは近年はあまり見られなくなってきています。どちらかといえば、インターフェースや抽象クラスなどを継承させるパターンが多いですが、基本的な考え方はどちらを使っても同じです。
この記事へのコメントはありません。