JPIN #9
ポリモーフィズム
ポリモーフィズムとは
日本語で言うと多態性という
オブジェクト指向では抽象化で使用する
ある要素がいくつかあるとする
要素はそれぞれ違うものだが意味としては同じ要素であると捉えて共通のものとして扱うようにする
これがポリモーフィズムである
Aクラスを継承したBクラスがあるとする
Aクラスの仕様変更はもちろんBクラスにも影響してくる
AクラスもXクラスやYクラスを継承していた場合、XクラスやYクラスにも影響が出てくる
例えばBクラスを継承しているB2クラスがあるとする
ここでメインクラスのAクラスがあったとする
AクラスではB2クラスを使いたい時、Aクラスでは「B b = new B2();」と書くことでB2クラスを使用することができる
Bはデータ型、つまりデータの扱い方を表すことができる
これはBのインスタンスのように扱うと宣言している
中身はヒープ領域に作られたB2のリンク先がbに入っている
これができるのはB2クラスにBの要素があるからである
そもそもB2クラスはBクラスと差分の複合である
これのB要素だけ見る、「B b = new B2();」で差分を無視して扱うことができる
ただしoverideされたものはその限りではない
カップヌードルはラーメンの一種なのか?
カップヌードルはカップラーメンの一種である
カップラーメンの種類としては、ラ王やカップヌードルになる
カップラーメンはインスタントラーメンである
インスタントラーメンは他に袋入りラーメンがある
袋入りラーメンではチキンラーメンがある
インスタントラーメンと対極にあるには調理するラーメンとなる
この二つの共通項がラーメンとなる
よってラーメンと証明することができる
しかしそもそもカップヌードルでググってみると袋タイプもあることがわかる
つまりカップヌードルはカップラーメンでもあり、袋麺でもある
これによりカップヌードルはカップラーメンから継承されているし、袋めんからも継承されていることになり、矛盾が生じる
よってカップヌードルはラーメンとは言えなくなってしまう
ではカップヌードルはなんなのか
そもそもラーメンは多くの味がある
それをラーメンとして一括りにする
次に提供の仕方が色々ある
カップであったり袋であったりどんぶりであったり・・・
これを入れ物パッケージとして先ほどのラーメンと結びつける
こうすることでカップラーメンや袋麺は表現することができる
しかしカップヌードルではないのである
カップヌードルを表したい場合はカップヌードルをブランドの一つと捉えて、それをブランドパッケージとする
このブランドパッケージをラーメンと結びつけることで初めてカップヌードルを表すことができる
よってカップヌードルはカップラーメンではないと言える
このように他が干渉しないようにすることを開閉原則という
ラーメンとも言えるのでは?
考え方によってはカップヌードルはラーメンじゃないの?となる人も多いだろう
それは間違いではないが正解ではないのである
上記のように多くのパターンを考えてパッケージや継承を考えておくことによって多くのパターンに対応することができるのである
特にjava言語は大規模なプログラムが多い
少しの変更が余計なところに響いてしまったりしては大変だし、色々な機能を後から付け足していくことも多い
よってこのような設計が非常に重要である