1

我能够大致了解 LSP 及其违规行为。比如说,Square 扩展具有 setWidth() 和 setHeight() 函数的 Rectangle 是对 LSP 的微妙违反,因为有一个额外的要求。类似地,GreenDuck 扩展了具有函数 something(Grass g) 的 Duck 类,不能有额外的子句要求草是绿色的。

对于正方形和矩形场景,我认为实现多边形接口和矩形和正方形类以自己的方式实现多边形是正确的。对于 GreenDuck 场景,GreenDuck 使用组合将 Duck 作为其字段之一可能是一个好主意。

Q1) 我对上述两种情况的理解是否正确?

Q2)另外,我无法模拟 LSP 允许“扩展”的场景,这让我想到了这个问题。有人可以深入研究 LSP 并提供具体的例子,哪些扩展是合适的,如果它是一些组合不会那么好的东西,那么它会带来什么好处。

编辑:为清楚起见

4

1 回答 1

3

在 Liskov 的上下文中,区分检查接口和修改接口很重要。从某种意义上说,正方形“是一个”矩形,就像矩形一样,您可以获得它的高度和宽度。它与矩形的不同之处在于您不能单独设置其高度和宽度。因此,如果“实现多边形接口是正确的”是指Rectangle应该有一个getPolygonVertices功能,那么当然,这很好。但是,如果您的意思是它应该实现一个具有的接口,setPolygonVertices那么这是错误的,原因与Square不能具有setHeightAndWidthlike的原因相同Rectangle

至于GreenDuckDuck会员……呃……那会有点奇怪。鸭子里面一般都有其他鸭子吗?

于 2014-10-29T20:36:39.540 回答