当前位置: 首页 > news >正文

动态网站开发用到的技术万网域名查询工具

动态网站开发用到的技术,万网域名查询工具,东昌府做网站,网站登录界面源码目录1 里氏替换原则2 里氏替换原则应用1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P…

目录

  • 1 里氏替换原则
  • 2 里氏替换原则应用


1 里氏替换原则

里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

定义看上去还是比较抽象,我们重新理解一下,可以理解为一个软件实体如果适用一个父类的话,那一定是适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。根据这个理解,我们总结一下:

引申含义:子类可以扩展父类的功能,但不能改变父类原有的功能。
1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2、子类中可以增加自己特有的方法。
3、当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。
4、当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类更严格或相等。

在前面讲开闭原则的时候埋下了一个伏笔,我们记得在获取折后时重写覆盖了父类的 getPrice()方法,增加了一个获取源码的方法 getOriginPrice(),显然就违背了里氏替换原则。我们修改一下代码,不应该覆盖 getPrice()方法,增加 getDiscountPrice()方法:
之前:

    public class JavaDiscountCourse extends JavaCourse {public JavaDiscountCourse(Integer id, String name, Double price) {super(id, name, price);}public Double getOriginPrice(){return super.getPrice();}public Double getPrice(){return super.getPrice() * 0.61;}}

更正:

public class JavaDiscountCourse extends JavaCourse {public JavaDiscountCourse(Integer id, String name, Double price) {super(id, name, price);}public Double getDiscountPrice(){return super.getPrice() * 0.61;}
}

2 里氏替换原则应用

使用里氏替换原则有以下优点:

1、约束继承泛滥,开闭原则的一种体现。
2、加强程序的健壮性,同时变更时也可以做到非常好的兼容性,提高程序的维护性、扩展性。降低需求变更时引入的风险。现在来描述一个经典的业务场景,用正方形、矩形和四边形的关系说明里氏替换原则,我们都知道正方形是一个特殊的长方形,那么就可以创建一个长方形父类 Rectangle 类:

public class Rectangle {private long height;private long width;public long getHeight() {return height;}public void setHeight(long height) {this.height = height;}public long getWidth() {return width;}public void setWidth(long width) {this.width = width;}
}

创建正方形 Square 类继承长方形:

public class Square extends Rectangle {private long length;public long getLength() {return length;}public void setLength(long length) {this.length = length;}@Overridepublic long getHeight() {return getLength();}@Overridepublic void setHeight(long height) {setLength(height);}@Overridepublic long getWidth() {return getLength();}@Overridepublic void setWidth(long width) {setLength(width);}
}

在测试类中创建 resize()方法,根据逻辑长方形的宽应该大于等于高,我们让高一直自增,知道高等于宽变成正方形:

public static void resize(Rectangle rectangle){while (rectangle.getWidth() >= rectangle.getHeight()){rectangle.setHeight(rectangle.getHeight() + 1);System.out.println("Width:" +rectangle.getWidth() +",Height:" + rectangle.getHeight());}System.out.println("Resize End,Width:" +rectangle.getWidth() +",Height:" + rectangle.getHeight());
}

测试代码:

public static void main(String[] args) {
Rectangle rectangle = new Rectangle();
rectangle.setWidth(20);
rectangle.setHeight(10);
resize(rectangle);
}

运行结果:
在这里插入图片描述

发现高比宽还大了,在长方形中是一种非常正常的情况。现在我们再来看下面的代码,把长方形Rectangle 替换成它的子类正方形 Square,修改测试代码:

public static void main(String[] args) {Square square = new Square();square.setLength(10);resize(square);
}

这时候我们运行的时候就出现了死循环,违背了里氏替换原则,将父类替换为子类后,程序运行结果没有达到预期。因此,我们的代码设计是存在一定风险的。里氏替换原则只存在父类与子类之间,约束继承泛滥。我们再来创建一个基于长方形与正方形共同的抽象四边形 Quadrangle 接口:

public interface QuadRangle {long getWidth();long getHeight();
}

修改长方形 Rectangle 类:

public class Rectangle implements QuadRangle {
private long height;
private long width;public long getHeight() {return height;}public void setHeight(long height) {this.height = height;}public long getWidth() {return width;}public void setWidth(long width) {this.width = width;}
}

修改正方形类 Square 类:

public class Square implements QuadRangle {private long length;public long getLength() {return length;}public void setLength(long length) {this.length = length;}public long getWidth() {return length;}public long getHeight() {return length;}
}

此时,如果我们把 resize()方法的参数换成四边形 Quadrangle 类,方法内部就会报错。因为正方形 Square 已经没有了 setWidth()和 setHeight()方法了。因此,为了约束继承泛滥,resize()的方法参数只能用 Rectangle 长方形。当然,我们在后面的设计模式中还会继续深入讲解。

http://www.hkea.cn/news/731128/

相关文章:

  • 广西建设网郭业棚seo推广具体做什么
  • 武汉网站seo诊断谷歌下载官网
  • 做地方网站能赚钱吗免费seo网站诊断
  • 图片设计在线网站推广优化外包便宜
  • 武汉平价做网站网络软文推广案例
  • 新产品线上推广方案鞍山seo外包
  • 网站建网站建设和优佛山网络推广培训
  • 毕业设计做网站怎么样微信crm管理系统
  • 个人网站开发多少钱电脑培训班零基础
  • 互联网有哪些岗位宁波免费seo在线优化
  • 惠州做棋牌网站建设哪家技术好哪里的网络推广培训好
  • 如何做线上赌博的网站推广策略有哪些方法
  • 男的女的做那个视频网站百度收录需要多久
  • 大通县wap网站建设公司网站免费制作
  • 哪个网站教做公众号甘肃百度推广电话
  • 网站怎么让百度收录广告网络推广
  • 小型网站设计及建设论文定制网站制作公司
  • 视频网站建设费用排名优化网站seo排名
  • 怎么自己做网站服务器linux百度账号查询
  • 梧州网站推广方案百度热搜 百度指数
  • 网站不兼容ie6自助建站模板
  • 甘肃网站建设公司百中搜优化软件
  • 国内外贸网站建设公司seo教程 百度网盘
  • 一物一码二维码生成系统最好用的系统优化软件
  • 如何在大网站做外链镇江网站建站
  • 杭州网站建设公司导航短视频营销案例
  • 昆明做网站建设有哪些长尾关键词排名工具
  • 一女被多男做的视频网站网站seo系统
  • 网站建设 青海网站建设找哪家好
  • win7 网站配置优化方案官网电子版