我听说 Liskov 替换原则 (LSP) 是面向对象设计的基本原则。它是什么,有哪些使用示例?
说明 LSP 的一个很好的例子(鲍勃叔叔在我最近听到的一个播客中给出)是有时在自然语言中听起来正确的东西在代码中并不完全有效。
在数学中,aSquare是 a Rectangle。实际上,它是矩形的特化。“is a”让你想用继承来建模。但是,如果在您制作的代码中Square派生自Rectangle,那么 aSquare应该可以在您期望 a 的任何地方使用Rectangle。这导致了一些奇怪的行为。
Square
Rectangle
想象一下,你的基类上SetWidth有SetHeight方法;Rectangle这似乎完全合乎逻辑。但是,如果您的Rectangle参考指向 a Square,那么SetWidth并且SetHeight没有意义,因为设置一个会更改另一个以匹配它。在这种情况下Square,里氏替换测试失败了,继承自Rectangle的抽象是一个糟糕的抽象。Square``Rectangle
SetWidth
SetHeight
Square``Rectangle
你们都应该看看其他无价的SOLID 原则励志海报。