里氏替换原则:

OO中的继承性的思考和说明:

1)继承包含这样一层含义:父类中凡是已经实现好的方法,实际上时在是设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整体继承体系造成破坏

2)继承在给程序设计带来便利的同时,也带来弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所以涉及到子类的功能都有可能产生故障

3)问题提出:在编程中,如何正确的使用继承?==》里氏替换原则

里氏替换原则基本介绍:

1.里氏替换原则(Liskov Substitution Principle) 在1988年,由麻省理工学院的以为姓里的女士提出的。

2.如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。换句话说,所有引用基本类型的地方必须能透明地使用其子类的对象。

3.在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。

4.里氏替换原则告诉我们,继承实际上让两个类的耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题。

案例:

1.main方法中的B的结果就是不正确的,原因是因为B中继承A的时候,不小心重写了A中的方法导致。

package liskov;public class Liskov {public static void main(String[] args) {A a = new A();System.err.println("11-3 = " + a.func1(11,3));System.err.println("1-8 = " + a.func1(1,8));B b = new B();System.err.println("11-3 = " + b.func1(11,3));System.err.println("1-8= " + b.func1(1,8));System.err.println("11+3+9=" + b.func2(11,3));}
}class A {public int func1(int num1,int num2){return num1-num2;}
}class B extends A{@Overridepublic int func1(int num1,int num2){return  num1 + num2;}public int func2(int num1,int num2){return func1(num1,num2) + 9;}}

2.改进,如果B要重写A的方法,那么提出一个基类,B和A都继承基类,同时B使用组合关系来解决继承A的问题。

package liskov.improve;public class Liskov {public static void main(String[] args) {A a = new A();System.err.println("11-3 = " + a.func1(11,3));System.err.println("1-8 = " + a.func1(1,8));B b = new B();//因为B类不再继承A类,因此调用者不会再认为func1是求减法了//调用完成的功能就会很明确了System.err.println("11-3 = " + b.func3(11,3));System.err.println("1-8= " + b.func3(1,8));System.err.println("11+3+9=" + b.func2(11,3));}
}class Base{}class A extends Base{public int func1(int num1,int num2){return num1-num2;}
}class B extends Base {//如果B需要使用到A类的方法,使用组合关系,一共有3中:依赖,聚合,组合private A a = new A();public int func1(int num1,int num2){return  num1 + num2;}public int func2(int num1,int num2){return func1(num1,num2) + 9;}public int func3(int num1,int num2){return this.a.func1(num1,num2);}
}

设计模式的七大设计原则:其四:里氏替换原则相关推荐

  1. 七大设计原则之里氏替换原则应用

    目录 1 里氏替换原则 2 里氏替换原则应用 1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 ...

  2. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  3. python里氏替换原则_设计模式六大原则之里氏替换原则

    这是设计模式6 大原则系列的第二篇文章,附上前一篇文章地址:设计模式六大原则之单一职责原则.本文主要讲解设计模式的里氏替换原则. 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其 ...

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

    面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性 提高代码的重用性 子类可以形如父类,但又异于父类 提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类 ...

  5. 开闭原则与里氏替换原则

    1.开闭原则 是面向对象设计的基本原则之一,是"可复用设计"的基础,它的主要原则是:对扩展开放,对修改关闭:意思就是我们改变一个软件时.应该通过扩展方式来改变软件,而不是修改原有的 ...

  6. 深入理解开闭原则、里氏替换原则

    开闭原则(Open-Closed Principle)里氏替换原则 开闭原则(Open-Closed Principle) What 什么是开闭原则? Why 为什么要使用开闭原则和When 什么时候 ...

  7. 面向对象七大设计原则之里氏替换原则

    熟练掌握和应用面向对象设计七大原则,是初中级工程师向高级/资深工程师进阶的一个必备技能.他可以大大的提升程序的可复用性和可维护性是重构代码的一大利器. 本人菜鸟一枚本面文章的出发点是1.加深个人印象. ...

  8. 设计模式六大原则之里氏替换原则、依赖倒置原则详解

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

  9. java solid设计原则_六大设计原则之里氏替换原则(LSP)

    一.SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substit ...

  10. 设计规则之里氏替换原则

    tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了.我们应该让自己写的代码更加优雅,即使这会费时费力. 相关规则: 推荐:体系化学习Java(Java面试专题) 1.6大 ...

最新文章

  1. windows2003 mstsc 远端连线,减少可会话数目 ,同一用户只允许一个会话
  2. 删除的页面怎么恢复_手机短信删除了怎么恢复?手机短信恢复最新教程
  3. Laravel大型项目系列教程(五)之文章和标签管理
  4. SpringBoot项目打war包部署Tomcat教程
  5. 类似新浪微博和google图片的HTML5实现图片拖拽上传功能
  6. 12. Window alert() 方法
  7. Java语言的Hook实现
  8. QQ配置文件解密(转)
  9. windows安装numpy库
  10. Flink 源码编译实战
  11. 信号完整性(SI)电源完整性(PI)学习笔记(三十三)102条使信号完整性问题最小化的通用设计规则
  12. python设置excel边框_用Python操作Excel电子表格?单元格边框如何设置?样式有哪些?...
  13. 小学期 BlueSky学长与友人帐
  14. 伴着代码,那个女孩儿慢慢长大
  15. 微信 服务器架构,微信技术总监周颢:一亿用户背后架构秘密
  16. java JPI中常使用的类介绍即java.lang包下的东西
  17. 【算法百题之四十二】罗马数字转整数
  18. 前端页面查看PDF文档内容总结
  19. 华硕天选如何进入BIOS界面
  20. 互联网大脑架构分析之腾讯:至少已布局三大AI实验室

热门文章

  1. Pandas set_indexreset_index
  2. C/C++语言学习的策略
  3. 什么是对象存储OSS-对象存储 OSS > 产品简介 > 什么是对象存储OSS
  4. Java基础学习总结(159)——JDK15 正式发布了!新增14个新特性
  5. python records库_Python Records库使用举例
  6. java中有关类的程序设计_《Java程序设计一》 1,设计课程类及类中包含的属性和方法....
  7. flutter怎么手动刷新_Flutter 小技巧实现通用的局部刷新
  8. nginx事件模块 -- 第六篇 stale event
  9. Java之一致性hash算法原理及实现
  10. 《工业控制网络安全技术与实践》一2.2 分布式控制系统