Java子类型设计

 Let q(x) be a property provable about objects x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T. ——Barbara Liskov
 S是T的子类型,对于T类型的对象x和S类型的对象y,q(x)是可证明的性质,q(x)也应该是可证明的。
 LSP 里氏代换原则:子类型必须能够替换它们的基类型。
 这要求:子类型要具有相同或更强的不变性,对所有方法相同或更强的后置条件以及相同或更弱的前置条件。
 最经典的例子就是矩形和正方形了,数学中认为长和宽相等的矩形为正方形,当设计矩形类和正方形类时,会自然而然的将正方形类作为矩形的子类设计,这时便会出现一些问题。
 正方形类的不变性要求长和宽相等且大于0,矩形要求大于0,不变性上满足,但在矩形类中添加方法:void setWide(int new)只修改宽,对于正方形来说要求必须要同时修改长和宽,也就意味着不能用正方形类替换矩形类,违反了里氏代换原则。
 修改后的设计思想应该是矩形类和正方形类作为形状类的子类来表示即可。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页