Q:
现要设计一个程序,这个程序通过设置四边形的边长来计算四边形的面积。假如程序中存在长方形类和正方形类,它们都具有设置边长的方法 setWidth(),setHeight() 和求面积的方法 area()正方形类是否应该被设计为长方形类的子类,为什么?
A:
不应该。
说明
长方形的高和宽可以分别修改,而正方形类的宽和高必须一同修改。如果长方形类是正方形类的子类,对于外界来说可以认为正在操作的是长方形类,因此会带来一些混淆。比如分别设置了正方形的宽和高,但实际上第二次设置的边长会覆盖掉第一次设置的边长。在进行面积的计算式得到的面积是第二次设置的边长的平方,而不是第一次设置的边长乘以第二次设置的边长。
关联
- LSP 里式替换原则
扩展
LSP 里式替换原则
如果对于每个类型是 S 的对象 o1 都存在一个类型为 T 的对象 o2,能使操作 T 类型的程序 P 在用 o2 替换 o1 时行为保持不变,我们就可以将 S 称为 T 的子类型。
里式替换原则是在设计继承时一个重要的指导准则,并不是有些东西看起来“像”,就将它们设计为继承关系。在设计继承关系时,可以参考 LSP 里式替换原则的描述,观察其是否符合,从而判断当前设计是否不适用于继承。
来源
正方形/长方形问题是一个著名的违反 LSP 的设计案例 —— 《Clean Architecture》chapter9