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