我能够大致了解 LSP 及其违规行为。比如说,Square 扩展具有 setWidth() 和 setHeight() 函数的 Rectangle 是对 LSP 的微妙违反,因为有一个额外的要求。类似地,GreenDuck 扩展了具有函数 something(Grass g) 的 Duck 类,不能有额外的子句要求草是绿色的。
对于正方形和矩形场景,我认为实现多边形接口和矩形和正方形类以自己的方式实现多边形是正确的。对于 GreenDuck 场景,GreenDuck 使用组合将 Duck 作为其字段之一可能是一个好主意。
Q1) 我对上述两种情况的理解是否正确?
Q2)另外,我无法模拟 LSP 允许“扩展”的场景,这让我想到了这个问题。有人可以深入研究 LSP 并提供具体的例子,哪些扩展是合适的,如果它是一些组合不会那么好的东西,那么它会带来什么好处。
编辑:为清楚起见