提到“子类”和“子类型”是不同的,替换原则只适合于子类型关系,而一般编程语言只是考虑了子类关系,子类说明了新类是继承自父类,而子类型强调的是新类具有父类一样的行为(未必是继承)。那么,什么时候才应该使用继承?那就是符合子类型关系的时候,或者一般所说的”is a"关系,你必须保证新类的行为与父类完全一致!!!在任何使用父类的场合,新类应该表现一样的行为。

经典案例:正方形是长方形的子类,但不是子类型

如果让正方形当做是长方形的子类,会出现什么情况呢?我们让正方形从长方形继承,然后在它的内部设置width等于height,这样,只要width或者height被赋值,那么width和height会被同时赋值,这样就保证了正方形类中,width和height总是相等的.现在我们假设有个客户类,其中有个方法,规则是这样的,测试传人的长方形的宽度是否大于高度,如果满足就停止下来,否则就增加宽度的值.现在我们来看,如果传人的是基类长方形,这个运行的很好.根据LSP,我们把基类替换成它的子类,结果应该也是一样的,但是因为正方形类的width和height会同时赋值,这个方法没有结束的时候,条件总是不满足,也就是说,替换成子类后,程序的行为发生了变化,它不满足LSP.(里氏代换原则)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/daryl715/archive/2007/05/29/1629841.aspx

提到“子类”和“子类型”是不同的相关推荐

  1. java数组子类型_[改善Java代码]数组的真实类型必须是泛型类型的子类型

    List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...

  2. JAVA学习笔记--类型转换(父类子类 Object 基本类型 String) 拆装箱 包装类

    最近一段时间忙着学习JAVA,本来net学的也不怎么好,趁着这个机会转下方向学习JAVA.不过.NET core的开源还是有点搞头的,微软了解一下.接下来几天我也会陆续写一些内容关于线程和集合等方面, ...

  3. [译] 3.泛型和子类型

    << 定义简单泛型 · 目录 · 通配符 >> 泛型和子类型 (Generics and Subtyping) 让我们来测试一下你对泛型的理解.下面的代码段合法吗? List& ...

  4. 如何在 Java 中安全地使用子类型

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 来自:唐尤华,importNew dzone.com/articles/how-to-sa ...

  5. UG\NX二次开发 获取工作部件下所有对象的类型和子类型 UF_OBJ_ask_type_and_subtype

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: UG\NX二次开发 获取工作部件下所有对象的类型和子类型,使用函数 UF_OBJ_a ...

  6. java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...

    前言: 要点都在代码注释中 1.泛型类 GenericInterface package com.demo.generic; import java.lang.reflect.Parameterize ...

  7. 泛型(派生子类,泛型通配符,类型擦除)

    目录 从泛型类派生子类 1.子类不是泛型类,明确父类类型 2.子类和父类都是泛型类 泛型通配符 1.类型通配符上限 2.类型通配符下限 类型擦除 从泛型类派生子类 1.子类不是泛型类,明确父类类型 c ...

  8. JS基础--子类型重写超类型方法原型链图解

    首先我们创建一个父类: // 创建一个父类构造函数 function Parent () {this.parentProperty = '父类属性'; } // 为父类添加一个原型方法 Parent. ...

  9. java数组子类型_在vhdl中获取数组子类型的范围属性

    您的问题是您尝试在类型上使用属性 . 但是,范围仅定义为数组(因此原型中为A) . 这意味着,即使数组类型受到约束,也需要使用实际数组 . -- Declarations -- Constrained ...

最新文章

  1. Notepad2 一个很不错的记事本
  2. RuntimeError: The current Numpy installation fails to pass a sanity check due to a bug in the window
  3. linux下 chown命令
  4. 【Flutter】Future 异步编程 ( 简介 | then 方法 | 异常捕获 | async、await 关键字 | whenComplete 方法 | timeout 方法 )
  5. 如何使用jlink从flash中读取数据保存为bin文件到本地
  6. nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)
  7. Spring mvc 中处理模型数据 ModelAndView
  8. 网络:WiFi6和WiFi5的区别介绍
  9. python set 随机_python – Set.pop()不是随机的吗?
  10. AI 降噪、多平台支持,在线课程背后的黑科技大公开!
  11. 拓端tecdat|R语言Lasso回归模型变量选择和糖尿病发展预测模型应用(含练习)
  12. 7个示例科普CPU Cache(from 酷壳网)
  13. 人事管理系统都有哪些功能和优势?
  14. C++中头文件iostream介绍
  15. 统计学习方法详解之第十三章 无监督学习概论
  16. PIPI OJ 1203: PIPI发工资(拓扑排序)
  17. .NET Framework各个版本(3.5 - 4.0)
  18. 使用POI给word文档加水印
  19. 英语不好,可以进外企吗?
  20. 通用课程表教师表php,利用Access实现学校课程表的科学管理

热门文章

  1. java jpanel添加背景_java – 将背景图像添加到JPanel
  2. 2019宁波本科计算机招聘工资,@宁波人,76282!2019年度平均工资是这么多,你拖后腿了吗?...
  3. element 使用阿里图标变形了_web前端大厂面试题(阿里云笔试篇)
  4. html ajax put请求,javascript – PUT Ajax请求
  5. php file抓取不到内容,深入file_get_contents函数抓取内容失败的原因分析
  6. flutter gridview 固定高度_Flutter +携程=?
  7. linux rm 不释放_Linux解决rm 删除大文件后 磁盘空间无法释放的问题
  8. zigzag算法_面经| 各大厂秋招算法工程师面经!你想了解的都在这里!
  9. 暂无支持此机型的手机版本_华为AR地图发布重要更新版本 新增对8款机型的支持...
  10. 模拟撞击_研究人员打造出能让橄榄球头盔承受住反复撞击的液态纳米泡沫