垄断游戏 - LSP OO原则

时间:2012-01-27 04:22:57

标签: oop liskov-substitution-principle

我正在设计一款大富翁游戏,同时还会阅读有关OO原则的更多信息。我正在阅读关于LSP(Liskov替换原则)的文章,发现要么我没有完全理解它,要么违反了它,应该改变我的设计。

(请注意:这个项目是个人的,只是为了好玩,所以我实际上并不关心代码的可维护性,但我只是要求个人教育和对LSP的理解)

让我先谈谈我迄今为止设计的内容:

BoardSpace是一个抽象基类,板上每个“种类”的空间都有一个子类。我有PropertySpaceTaxSpaceGoSpace

BoardSpace包含有关空间在棋盘上的位置的信息,以及一个抽象的void Land()方法,以便每个不同的空间可以在落地时执行不同的操作。这样,当我在当前Land()对象上调用BoardSpace时,它不需要关心或考虑任何其他事情,只需做空间应该做的事情。对我而言,这是有道理的,听起来像是一个可行的解决方案。

但似乎与LSP相反,所有这些不同的Land()重写方法将完全不同,因为我已经设计了它们。

还是我误解了LSP?它是否与Land()“预期”或“描述”的工作方式有关?在这种情况下,每个空间完全不同,所以没关系?或者它肯定是违规行为,我应该重新设计它?

附带问题:这会被视为继承或滥用继承吗?

1 个答案:

答案 0 :(得分:1)

在LSP下,子类方法可以完成与超类完全不同的事情,只要它们不违反超类的合同。所以这一切都取决于你做多宽合同。

如果BoardSpace.Land()只允许更改播放器的状态,那么如果登陆子类允许玩家购买它(改变空间状态),则会遇到问题。但是,如果允许Land()更改登陆播放器和拥有播放器的状态,空间状态以及卡片组的状态,则不会违反LSP。

尽管如此,将事情分解成更小的方法可能是一种很好的做法,你可以更准确地推理出来。例如,当您降落时(如绘制卡片),空间可能会对其进行特殊操作,然后是玩家与空间所有者(其他玩家或银行)之间的交易,其约束条件为只影响玩家和卡片组的现金和卡,交易只能影响两个参与方的资金和空间的所有权。