説明する時にいつも読むのでまとめ
ポリモーフィズムとは
メッセージの送り方を共通にするもの
- 親クラス生成時に子クラスに渡すメッセージを共通にする仕組み
- インターフェースを使って(Javaの場合)メッセージを共通にする仕組み
- コードの重複を排除して汎用性の高い部品をつくる仕組みの1つ
- オブジェクト指向三大要素の1つ
- 意訳すると多態性
特徴
概念的側面(現実世界)
上位と下位の概念それぞれの動詞として成立する
共通の動詞が成立する
- 例えば「動物」と「人間」と「犬」
- 「動物」(上位)が「食べる」
- 「人間」(下位)が「食べる」
- 「犬」が(下位)「食べる」
切り口を1つにしている
- 1つのオプション(追加情報)で固有の挙動が成立する
- 例えば「動物」と「人間」と「犬」
- 「動物」が「食べる」-> どんな感じで食べるか定まっていない
- 「動物」の「人間」(オプション)が「食べる」-> 食べ物を手で口に近づけて食べる
- 「動物」の「犬」(オプション)が「食べる」-> 食べ物に頭を近づけて口で食べる
技術的側面(プログラミング)
引数を受け取ったインスタンスがクラスによって違う振る舞いをする
共通のメソッド名で成立する
- スーパークラスとサブクラスそれぞれのメソッドとして成立する
- 例えば「Animal」と「human」と「dog」と「chef」(eater)
- 「シェフ」が「動物」(食べるくん)に提供して「動物」(食べるくん)がそれを「食べる」
- 「動物」(食べるくん)を変えるだけでぱくぱく食べてたりがぶがぶ食べてたりする
プログラミング技術における「継承」を利用した場合
Animal.java
public abstract class Animal {
public abstract void eat();
}
Human.java
public class Human extends Animal {
public void eat() {
System.out.println("ぱくぱくたべる");
}
}
Dog.java
public class Dog extends Animal {
public void eat() {
System.out.println("がぶがぶたべる");
}
}
Chef.java
public class Chef {
public void serve(Animal animal) {
System.out.println("どうぞー");
System.out.println(animal.eat());
}
}
プログラミング技術における「インターフェース」を利用した場合
Eater.java
public interface Eater {
public void eat();
}
Human.java
public class Human implements Eater {
public void eat() {
System.out.println("ぱくぱくたべる");
}
}
Dog.java
public class Dog implements Eater {
public void eat() {
System.out.println("がぶがぶたべる");
}
}
Chef.java
public class Chef {
public void serve(Eater eater) {
System.out.println("どうぞー");
System.out.println(eater.eat());
}
}
ポイント
- 継承の機能を使ったものもインターフェースの機能を使ったものも共通していえるのは呼び出し方が種類関係なく同じ(ここでいうとシェフが提供する相手)という部分
- interfaceはポリモーフィズムを実現するためのようなもの
- interfaceの機能は言語的にサポートしていないものもある(Rubyなどはそう)
関連記事
書籍情報
平澤 章 (著) オブジェクト指向でなぜつくるのか 第2版
https://amzn.to/2VSrzwe
雑感
デザインパターンやリファクタリングでもこの視点をもてていると上手く適用できる