利斯科夫替代原则

时间:2014-10-29 20:27:32

标签: inheritance design-patterns liskov-substitution-principle

我能够全面了解LSP及其违规行为。比方说,Square扩展了一个具有setWidth()和setHeight()函数的Rectangle,这是对LSP的一种微妙违反,因为还有一个额外的要求。类似地,GreenDuck扩展Duck类的功能(Grass g)不得有额外的条款要求草是绿色的。

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

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

Q2)此外,我无法对LSP允许“扩展”的情况进行建模,这使我产生了问题。有人可以深入研究LSP并提供具体的例子,其中扩展是合适的,如果组合不是那么好的话可以获得奖励。

编辑:为清晰起见

1 个答案:

答案 0 :(得分:3)

在Liskov的背景下,区分检查接口和修改接口非常重要。一个正方形的“is-a”矩形,就像一个矩形一样,你可以得到它的高度和宽度。它与矩形的不同之处在于您无法单独设置其高度和宽度。因此,如果“实现多边形接口是正确的”,则表示Rectangle应该具有getPolygonVertices函数,那么确定,那很好。但是,如果你的意思是它应该实现一个setPolygonVertices的接口,那就错了,原因与Square不能像setHeightAndWidth一样Rectangle

至于有GreenDuck成员的Duck .... eeeh ......这有点奇怪。鸭子里面一般有其他鸭子吗?