- オブジェクト指向なんて今すぐやめてください
283 :デフォルトの名無しさん[sage]:2014/04/07(月) 11:37:39.15 ID:LtIPC3gj - OOの勉強を始めた頃、たいていの人はis-a関係なら継承できるということを知り、AnimalやDogがどうこうとか
BirdとPenguinがどうこうみたいな説明を読んで、わかったようなわからないような感じで通り過ぎたと思う。 >>194のコードの問題の本質は、具象クラスを継承したことにあるのではなくて、長方形と正方形が実は is-a関係ではないということ。 何がis-a関係を壊しているかというと、長方形はwidthとheightを個別に設定出来なければならないが、 正方形は個別に設定されると正方形ではなくなるという性質。 これはよく知られた問題で、C++ FAQに"Is a Circle a kind-of an Ellipse?"という項目がある。 http://www.parashift.com/c++-faq/circle-ellipse.html 軽くググると、1996年に、故まさーる氏のNiftyでの発言が引っかかる。 http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/nifty-logs/circle-isa-rectangle.html is-a関係に関しては、 リスコフの置換原則(LSP)というものが提唱されてて、LSPを破る例として「長方形-正方形」 問題が良く取り上げられる。知らなかった人は、このスレの議論より「LSP 正方形」でググった方がいい。 LSP違反になる危険性があるから具象クラスの継承は全て禁止というのは思考停止で、具象クラスを継承するなら LSP違反にならないようにしようというのが正しいエンジニアの態度だと思うね。
| - オブジェクト指向なんて今すぐやめてください
284 :デフォルトの名無しさん[sage]:2014/04/07(月) 11:42:56.92 ID:LtIPC3gj - で、>>260で
> ・安易な具象クラス継承(>>194)には、問題(>>207前段,210)がある という微妙な表現になっているが、これは安直ではない具象クラスの継承ならやってもOKということなのかな? 大きく戻るが、元スレの以下のコードに問題があるなら、それを指摘して欲しい。 class Person def work # 具体的なコード end def eat # 具体的なコード end def sleep # 具体的なコード end end class Japanese < Person def sleep # Japanese特有なコード end end
|
|