我正在设计一个大富翁游戏,同时也在阅读更多关于 OO 原则的内容。我正在阅读 LSP(Liskov 替换原则),发现要么我没有完全理解它,要么违反了它,应该改变我的设计。
(请注意:这个项目是个人的,只是为了好玩,所以我实际上并不关心代码的可维护性,但我只是要求个人教育和对 LSP 的理解)
让我从我迄今为止的设计开始:
类BoardSpace
是一个抽象基类,板上的每个“种类”空间都有一个子类。所以我有PropertySpace
, TaxSpace
, GoSpace
, 等等。
BoardSpace
有关于空间在板上的信息,还有一个抽象的void Land()
方法,这样每个不同的空间在登陆时可以做不同的事情,因为它应该。这样,当我调用Land()
当前BoardSpace
对象时,它不需要关心或考虑其他任何事情,只做空间应该做的事情。对我来说,这是有道理的,听起来像是一个可行的解决方案。
但它似乎与 LSP 背道而驰,因为所有这些不同的Land()
重写方法都会做完全不同的事情,就像我设计的那样。
还是我误解了 LSP?它与Land()
“预期”或“描述”的工作方式有更多关系吗?在这种情况下,每个空间完全不同,所以没关系?或者它肯定是一种违规行为,我应该重新设计它?
附带问题:这会被认为是对继承的“滥用”还是对继承的良好利用?