有趣的软件开发问题系列1.正方形是否应该设计为长方形的子类?

Q:

现要设计一个程序,这个程序通过设置四边形的边长来计算四边形的面积。假如程序中存在长方形类和正方形类,它们都具有设置边长的方法 setWidth(),setHeight() 和求面积的方法 area()正方形类是否应该被设计为长方形类的子类,为什么?

A:

不应该。

说明

长方形的高和宽可以分别修改,而正方形类的宽和高必须一同修改。如果长方形类是正方形类的子类,对于外界来说可以认为正在操作的是长方形类,因此会带来一些混淆。比如分别设置了正方形的宽和高,但实际上第二次设置的边长会覆盖掉第一次设置的边长。在进行面积的计算式得到的面积是第二次设置的边长的平方,而不是第一次设置的边长乘以第二次设置的边长。

关联

  • LSP 里式替换原则

扩展

LSP 里式替换原则
如果对于每个类型是 S 的对象 o1 都存在一个类型为 T 的对象 o2,能使操作 T 类型的程序 P 在用 o2 替换 o1 时行为保持不变,我们就可以将 S 称为 T 的子类型。

里式替换原则是在设计继承时一个重要的指导准则,并不是有些东西看起来“像”,就将它们设计为继承关系。在设计继承关系时,可以参考 LSP 里式替换原则的描述,观察其是否符合,从而判断当前设计是否不适用于继承。

来源

正方形/长方形问题是一个著名的违反 LSP 的设计案例 —— 《Clean Architecture》chapter9

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、六大设计原则 原则一:单一职责原则 定义 Software entities (classes, module...
    鱼弎思阅读 1,045评论 1 4
  • 【教学目标】 A类目标:自主探索长方形,正方形面积的计算方法。 B类目标:会正确计算长方形,正方形的面积。 C类目...
    柠檬非酸阅读 1,670评论 0 0
  • 长方形与正方形 教学目标: 1、 结合观察、操作活动,能够用自然的语言描述长方形和正方形的特征。 2、 了解折、画...
    密芬阅读 1,579评论 0 1
  • 今天是圣诞节,也是我到HZG整满3个月的日子。踏在异国他乡的土地上笨拙的开始一个人的生活,三个月的时间给我的经验,...
    MelodyEinmal阅读 238评论 0 1
  • 今天对宝贝来说,是一个既紧张又开心的日子。 当下午放学走出校门的那一刻,孩子们好开心,终于自由了,解放...
    小轩仔0808阅读 138评论 0 0