| At line 4 changed one line |
| *多態性 (ポリモーフィズム:Polymorphism) |
| *多態性 (ポリモーフィズム:polymorphism) |
| At line 13 removed 23 lines |
| !!実体を並べてみないと多態性を定義できない |
| 多態性について注意すべき点は、設計時と実装時で視点を180度替える必要があることです。\\ |
| !【設計時】 |
| #実体(オブジェクト)を先に並べて比較する。 |
| #共通的な処理を抽出する。 |
| #その処理を再定義する(呼び出し名、戻り値、引数を共通化する)。 |
| #インタフェースの場合はインタフェース名を決める。 |
| 上記のような流れになりますが、特にインタフェースを決める場合、それよりも先に実体(オブジェクトとクラス)が無いと共通化は出来ません。つまり、\\ |
| *クラス→インタフェース |
| の順番で設計していくことになります。\\ |
|
| !【実装時】 |
| #設計時に決めたインタフェースまたはabstractメソッドを実装する。 |
| #それらを実現するためのクラスを実装する。 |
| 言うまでもありませんが、インタフェースやabstractメソッドが先に無いと実現クラスの実装は出来ません。つまり、\\ |
| *インタフェース→クラス |
| の順番で実装していくことになります。\\ |
|
| 設計者のほとんどは実装を先に経験するためだと思いますが、 |
| *多態性を利用する際は、まず最初に個別の実体(クラス)を並べてみて共通化する必要がある |
| ことに気付いていない人が多いように思います。インタフェースやabstractメソッドはクラスよりも先に出来るものと思っているようなのです。\\ |
| 視点を180度替える必要があるというのはこのことです。\\ |
|
| At line 43 removed one line |
| #電車 |
| At line 47 changed 8 lines |
| ですね。いずれも、人を乗せて運ぶことがその役割です。\\ |
| 少し考えてみれば判りますが、 |
| *「今日は乗り物を使って移動した。」 |
| と聞いた時に、 |
| *「何に乗ったの?」 |
| という疑問が起こると思います。一方で、\\ |
| *「今日は電車で来た。」 |
| と聞いて、「何に乗ったの?」とは誰も思いません。これは、\\ |
| ですね。人を乗せて運ぶことがいずれもその役割です。それでは、 |
| *「今日は乗り物で来た。」ともし言われたら、 |
| *「何に乗ったの?」という疑問が起こると思います。 |
| 一方で、\\ |
| *「今日は自転車で来た。」と聞いて |
| *「何に乗ったの?」とは誰も思いません。 |
| なぜなら、\\ |
| At line 56 changed one line |
| からです。 |
| からです。つまり「乗り物」という役割だけを聞いてもその実体が自転車なのかバイクなのかは判断つきません。\\ |
| そしてこれは、 |
| At line 58 changed one line |
| と同じ事です。\\ |
| のと同じ事です。何が出来るのか(責務または役割)だけを決めてもその実体は複数あり得るのです。\\ |
|
| !!実体を並べてみないと多態性を定義できない |
| 多態性を利用する時に注意すべき点は、設計時と実装時で手順を180度替える必要があることです。\\ |
| !【設計時】 |
| #実体(クラス)を先に並べて比較する。 |
| #共通的な処理を抽出する。 |
| #その処理を再定義する(呼び出し名、戻り値、引数を共通化する)。 |
| #インタフェースの場合はインタフェース名を決める。 |
| 上記のような流れになりますが、特にインタフェースを決める場合はそれよりも先に実体(クラス)が無いと共通化は出来ません。乗り物の例と同じです。乗り物という役割が先にあるのではなく、自転車やバイクを並べてみると乗り物という役割が浮き彫りになるのです。つまり、\\ |
| *クラス → インタフェース |
| の順番で設計していくことになります。\\ |
| 実体を並べてみて共通化あるいは抽象化することを |
| *汎化 |
| と言います。一般的な言葉である__「汎用化」__と同じ意味です。 |
|
| !【実装時】 |
| #設計時に決めたインタフェースまたは抽象メソッドを実装する。 |
| #それらを実現するためのクラスを実装する。 |
| 言うまでもありませんが、インタフェースや抽象メソッドが先に無いと実現クラスの実装は出来ません。つまり、\\ |
| *インタフェース → クラス |
| の順番で実装していくことになります。\\ |
|
| *多態性を定義する際は個別の実体(クラス)を先に並べてみて共通化する |
| ことに注意して下さい。インタフェースや抽象メソッドがクラスよりも先に出来るわけではありません。\\ |
| 視点を180度替える必要があるというのはこのことです。\\ |