結論から言おう。答えはYes(の場合もある)。
どうも、そうではないと思っている人も結構いるらしい(どこのトンデモ本が言いふらしてるんだか知らないが)。
この答えがNoであると頑なに信じている人にモデリングはできない。
我々のよく知る数学は、「正方形は長方形の一種である」と言う。その通りだ。
しかし、オブジェクト指向で継承関係を考える際には、これは成り立たないと言う人が多い。それは違う。
このへん
http://www.objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/nifty-logs/circle-isa-rectangle.html
が有名だろうか。
さて、このページの間違いがわかるかな?
答えはここ。
> 普通、長方形クラスのユーザは縦の長さを変更しても横の長さが変わらないと期待するでしょう。
その期待が間違い。
数学的に「正方形は長方形の一種である」と言う時、この「長方形」の定義は何か。
それは「4つの角がすべて直角である四角形」である(別に3つでもいいけど、同じこと)。
そこには「縦と横の長さは独立している」などという要件はない。
数学的には、正方形は長方形の一種であるからという理由で継承関係にしているのに、数学にない期待をするからおかしくなる。
しかしながら、ここで言いたいことは「縦と横の長さを独立して変えられるような長方形クラスを作るべきではない」ということではない。
- 数学的なアプローチが適切でないなら、そのような長方形クラスはあってもよいが、その場合は正方形をそこから派生させるべきではない
- 数学的なアプローチが適切なら、正方形を長方形のサブクラスにするべきだが、それなら、縦と横の長さは独立しているという期待をすべきではない。
ということだ。
要約すると「答えは一つではない」ということである。
何が正解なのかは場合によって変わる。同じことだが、何が間違いなのかも場合によって変わる。
数学的なアプローチが適切な場合も、そうでない場合もある。非ユークリッド幾何学の世界では、「長方形とは4つの角が直角である四角形」という定義さえ歪む。
どんな場合にも正しい、あるいは間違えているモデルなんかない。
同じページには、
> 現実の世界の IS-A 関係とオブジェクト指向の IS-A 関係は違うこともあるんだ,ということを理解してもらわなければならないでしょう
とも書いてあるが、そもそも現実の世界のIS-A関係からして一通りではないということを理解するのが先である。