6大设计原则之里氏替换原则

面对对象中的继承

优点如下:

  1. 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性
  2. 提高代码的重用性
  3. 子类可以形如父类,但又异于父类
  4. 提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类来实现的
  5. 提高产品或项目的开放性

缺点如下:

  1. 继承是侵入性的.只要继承,就必须拥有父类的所有属性和方法
  2. 降低代码的灵活性.子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束
  3. 增强了耦合性.当父类的常量、变量和方法被修改时,需要考虑子类的修改,有时更会带来非常糟糕的结果--大段代码需要重构

里氏替换原则的定义

如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型.

通俗点讲,只要父类能出现的地方子类就可以出现,而且替换成子类也不会产生任何错误或异常,使用者可能根本不需要知道是父类还是子类.但是反过来就不行了,有子类出现的地方,父类未必能适应.

里氏替换原则的规范(继承的规范)

1.子类必须完全实现父类的方法

例如有一个打枪的游戏,类图如下

6大设计原则之里氏替换原则

 

其 Soldier 代码如下

6大设计原则之里氏替换原则

 

注意: 在类中调用其他类时,要使用父类或接口,否则就违背了里氏替换原则

这时,如果有一个玩具枪 ToyGun, 继承自 AbstractGun,显然是不合适的,因为玩具枪没有伤害,可以新建一个抽象类 AbstractToy,将声音、形状都委托给 AbstractGun 处理,然后两个基类下的子类自由延展,互不影响

注意: 如果子类不能完整的实现弗雷的方法,或者弗雷的某些方法在子类中已经发生"畸变",则建议断开父子继承关系,采用依赖、聚集、组合等关系替代

2.子类可以有自己的个性

里氏替换原则可以正着用,但不能反着用.在子类出现的地方,父类未必就可以胜任

3.覆盖或实现父类的方法是输入参数可以被放大

举个例子,先定义一个 Father 类

6大设计原则之里氏替换原则

 

然后再定义一个子类:

6大设计原则之里氏替换原则

 

虽然子类方法与父类方法同名,但不是覆写父类方法,而是重载,因为输入参数不同

父类的参数范围小,当调用子类 doSomething方法时,若参数为HashMap调用父类方法,若为Map调用子类方法

要是反过来,子类的 参数比父类范围下,就违背了里氏替换原则

4.覆写或实现父类的方法是输出结果可以被缩小

这个也不难理解,也就是说父类方法返回的是Map时,子类可以返回HashMap

但是反过来,父类返回的是HashMap,而子类返回Map类型就违背了里氏替换原则

采用里氏替换原则的好处

增强程序的健壮性,版本升级是也可以保持非常好的兼容性.即使增加子类,原有的子类还可以继续运行.在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑,完美!


采用里氏替换原则,应尽量避免子类的"个性",一旦子类有"个性",这个子类和父类之间的关系就很难调和了,把子类当作父类使用,将子类的"个性"抹杀;把子类单独作为一个业务来使用,会让代码间的耦合关系变得扑朔迷离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scikit-learn安装

安装找到一个简书版本,讲的挺好的,先贴网址 https://www.jianshu.com/p/26ab6c22051e 但是在安装过程中,遇见了问题,现在贴一下: numpy_quaternion-2018.5.17-cp36-cp36m-win32.whl is not a supported wheel on this …

6大设计原则之依赖倒置原则

依赖倒置原则的定义 依赖倒置原则的原始定义如下: High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions. 翻译过来,包含如下三层…

论文写作——paper Note

论文的一些细节: 1)数字10以下一般用英文单词,10以上用阿拉伯字母; 2)公式最后要有标点,逗号(后面跟where。。。)或者句号; 3)figure的caption尽量多写一点内…

6大设计原则之接口隔离原则

接口隔离原则的定义 什么是接口. 实例接口,比如定义了一个Person类,然后 Person p new Pserson(); 产生一个实例,Person类就是 p 的接口类接口,就是Java中使用 interface 定义的接口 什么是隔离 隔离要求将接口尽量细化,同时接口中的方法尽量少. 接口隔离原则的实现 比如…

6大设计原则之迪米特法则

迪米特法则的定义 迪米特法则也称为最少知识原则,一个对象应该对其他对象有最少的了解. 通俗的讲,一个类应该对自己需要耦合或调用的类知道的最少,被调用类的内部是如何复杂都和我没关系,我就知道你的这些public方法,我就调用这么多,其他的我一概不关心. 迪米特法则对类的低耦…

论文写作——origin画图

一 origin的安装 详见下面网址,内涵下载路径和破解方法。 http://www.ddooo.com/softdown/51005.htm 1. 下载origin 网址:https://thepcgo.com/origin-pro-8-0-free-download/ 2.下载破解相关压缩包 链接:https://pan.baidu.com/s/1LwA…

论文写作——texstudio+texlive

一 安装 安装见下方链接 https://jingyan.baidu.com/article/63f236287febc50208ab3deb.html 二 使用 1、选择模板 IEEE: https://ieeeauthorcenter.ieee.org/create-your-ieee-article/use-authoring-tools-and-ieee-article-templates/ieee-article-templates/ ACM:…

6大设计原则之开闭原则

开闭原则的定义 开闭原则的定义: 一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭.即一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化. 软件实体包括一下部分 项目或软件产品中按照一定的逻辑规则划分的模块抽象和类方法 注意: 开闭原则对…

论文写作——如何作图(visio/ppt+Adobe Acrobat Pro)

前言 在论文中,基本上的图都要求是矢量图,就是即使放大也不会失真。 .eps是最常被要求用的,然而我使用了各种方法(可以试试在线转换格式,很方便)都没能成功转成打得开看得见的.eps格式,又懒得…

23种设计模式之单例模式

单例模式的定义 定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的通用类图如下: 单例模式的优缺点 单例模式的优点: 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的创建、销毁时,而且创建和销毁时性能又无…

讲座记录——大数据共享和交易的挑战与初探

讲者:中科大李向阳教授 数据市场特点: 数据量大且无限供应、价格差异大、所有权不确定、无标准衡量指标、可无限复制 数据交易模式: 买卖双方面对面交易 、通过第三方平台交易(京东万象、数据宝、上海数据交易中心……&#x…

23种设计模式之工厂方法模式

工厂方法模式的定义 定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类 工厂方法模式的通用类图: 其中 Product 负责产品的共性,实现对事物最抽象的定义; Creator 为抽象创建类, 也就是抽象工厂, 具体如何创建产品类是由具体…

NS2相关学习——无线网(2)

在这里,我们将完成一个简单的无线多跳场景 首先,定义的参数如下所示: set val(chan) Channel/WirelessChannel set val(prop) Propagation/TwoRayGround set val(netif) Phy/WirelessPhy set val(mac) Mac/802_11 …

23中设计模式之抽象工厂模式

抽象工厂模式的定义 定义: 为创建一组相关或互相依赖的对象提供一个接口,而且无须制定它们的具体类 抽象工厂模式的实现 两个产品族, 其类图如下: 抽象产品类代码如下: 产品A的1级和2级类代码如下: 产品B与产品A类似 抽象工厂类 AbstractCreator 的职责是定义 每个工厂要实…

California Fault Lines: Understanding the Causes and Impact of Network Failures

摘要: 影响端到端服务可用性的主要因素中,网络组件故障可能是最无法预知得。 失败发生的频率多高,持续多久,原因是什么以及它们如何影响客户? 传统上,回答诸如此类的问题需要在网络中广泛部署的专用&#x…

23种设计模式之模板方法模式

模板方法模式的定义 定义一个操作中的算法的框架,而将一些步骤延迟到子类中. 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 通俗的讲,就是将子类相同的方法, 都放到其抽象父类中 类图如下: 其中, AbstractClass 叫抽象模板, 它的方法分为以下两类: 基…

课堂笔记——Ubiquitous Computing

一 课程相关 1、Course Objectives provide a unified overview on the broad filed of Ubiquitous Computing 2、Evaluation short talk1(25%)第三次课 paper reading of 2017(Percom,Ubicomp,IJCAI,KDD,AAAI) short talk 2 (25%) 第五次课 pape…

23种设计模式之建造者模式

建造者模式的定义 建造者模式也叫生成器模式, 定义如下: 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示 类图如下: 在建造者模式中, 四个角色如下: Product 产品类: 通常是实现了模板方法模式, 也就是有模板方法和基本方法Builder 抽象建造者…

23种设计模式之原型模式

原型模式的定义 定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象. 通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象 原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象…

课堂笔记——Data Mining(1)

一、Introduction …… 1、Major Issues in Data Mining User Interaction Presentation and visualization of data mining results : Efficiency and Scalability Diversity of data types: complex types of data; Mining dynamic, networked, and global data reposit…