モノポリー ゲームを設計しながら、OO の原則についても詳しく調べています。LSP (Liskov Substitution Principle) について読んでいて、それを完全に理解していないか、違反しているため、設計を変更する必要があることがわかりました。
(注記: このプロジェクトは個人的な楽しみのためのものなので、実際にはコードの保守性は気にしませんが、個人的な教育と LSP の理解を求めているだけです)
これまでに設計したものから始めましょう。
クラスBoardSpace
は抽象基本クラスであり、ボード上の「種類」のスペースごとに 1 つのサブクラスがあります。だから私は、、、PropertySpace
などTaxSpace
を持っていますGoSpace
。
BoardSpace
スペースがボード上のどこにあるかに関する情報と抽象void Land()
メソッドを持っているため、それぞれの異なるスペースに着陸したときに異なることを行うことができます。Land()
そうすれば、現在のオブジェクトを呼び出しているときにBoardSpace
、他のことを気にしたり考えたりする必要がなく、スペースがすべきことを行うだけです。私にとって、これは理にかなっており、実行可能なソリューションのように思えます。
Land()
しかし、私が設計したように、これらの異なるオーバーライドされたメソッドはすべてまったく異なることを行うという点で、LSP に反しているようです。
または、LSP を誤解していますか? Land()
「期待される」または「説明される」方法と関係がありますか?この場合、どれがスペースごとに完全に異なるので大丈夫ですか? それとも、それは確かに違反であり、再設計する必要がありますか?
副次的な質問: これは継承の「乱用」と見なされますか、それとも有効な使用と見なされますか?