こんにちは!ISAMU(@burlesca_isa)です!
今回の対象読者は
- javaのポリモーフィズムについて知りたい方
この記事を読むと
ポリモーフィズムのざっくりとしたイメージ
が分かります。
ポリモーフィズムとは?
共通のインターフェースをもつ操作で、
インスタンスごとに振る舞いや動作が異なることをポリモーフィズムといいます。
オブジェクト指向の3代要素の一つです。
ポリモーフィズムを覚えることによって効率よく開発できるようになります。
ポリモーフィズムの考え方
ポリモーフィズムの考え方はインスタンスをざっくり捉えることです。
オブジェクト指向は具体と抽象(is a)という考え方が重要です。
具体と抽象を簡単に言うと、
例えば佐藤クラスのインスタンスを作りたい場合は、
佐藤を抽象化すると人間、人間を抽象化すると生物です。
生物をインターフェースとして、
人間クラスでimplementsで生物インターフェースを実装するという流れになります。
「佐藤はざっくりいうと生物だよね」という具体と抽象をイメージすることが重要です。
「ざっくり」をプログラムで記述するには代入を使用する
通常、インスタンスを作成する際には下記の構文を使用していました。
クラス インスタンス名 = new クラス();
佐藤インスタンスを作成する場合は
Sato obj = new Sato();
と記述します。
多様性で考える場合、
「人間はざっくりいうと生物だよね」と考えることができるので、
生物インターフェースで宣言した変数に人間クラスを代入することができます。
Creature obj = new Sato("佐藤");
多様性の便利な利用方法
継承関係やインターフェースを利用する場合、
クラスをざっくり捉えることで、メソッドや配列などで有効に利用できます。
変数に格納して利用する
メソッドの引数リストで利用することができます。
サンプルプログラム
ここでは生物インターフェースを実装した人間抽象クラス、
人間抽象クラスを継承したSatoクラスとSuzukiクラスを定義しています。
インターフェースでは情報を表示するためのprint()抽象メソッドが記載されているため、
SatoクラスとSuzukiクラスでオーバーライドしています。
通常の呼び出し方法はsato.print();でも良いのですが、
mainPrintメソッドを作成して引数リストの宣言をインターフェースのCreatureにしています。
Creatureインターフェースを実装しているSatoとSuzukiはこのメソッドに引数として渡すことが可能になります。
配列やListに格納できる
通常、宣言したクラスの型が異なる場合は配列やListには格納できません。
しかし、多様性を利用すれば異なるクラスの格納も可能になります。
サンプルプログラム
この例ではArrayListの宣言にインターフェースのCreatureを使用して、
SatoクラスとSuzukiクラスのインスタンスを追加しています。