里氏替换原则——面向对象设计原则_里氏替换原则应用场景

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

燕子将飞行2.5小时.
几维鸟将飞行Infinity小时。

程序运行错误的原因是:几维鸟类重写了鸟类的 setSpeed(double speed) 方法,这违背了里氏替换原则。正确的做法是:取消几维鸟原来的继承关系,定义鸟和几维鸟的更一般的父类,如动物类,它们都有奔跑的能力。几维鸟的飞行速度虽然为 0,但奔跑速度不为 0,可以计算出其奔跑 300 千米所要花费的时间。其类图如图 2 所示。

“几维鸟是动物”实例的类图
图2 “几维鸟是动物”实例的类图

进阶阅读

如果您想了解里氏替换原则在实际项目中的应用,可以猛击阅读《使用里氏替换原则解决实际问题》文章。

使用里氏替换原则解决实际问题

下面介绍一个经典的业务场景,用正方形、矩形和四边形的关系来说明里氏替换原则。

我们都知道正方形是一个特殊的长方形,首先创建一个长方形父类 Rectangle,代码如下。

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

在测试类中,创建 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);
}

运行结果如下:

width: 20,Height: 11
width: 20,Height: 12
width: 20,Height: 13
width: 20,Height: 14
width: 20,Height: 15
width: 20,Height: 16
width: 20,Height: 17
width: 20,Height: 18
width: 20,Height: 19
width: 20,Height: 20
width: 20,Height: 21
Resize End,width:20 ,Height:21

由运行结果可知,高比宽还大,这在长方形中是一种非常正常的情况。再看下面的代码,把长方形替换成它的子类正方形,修改客户端测试代码如下:

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

此时,运行出现了死循环,违背了里氏替换原则,在将父类替换成子类后,程序运行结果没有达到预期。因此,代码设计是存在一定风险的。

里氏替换原则只存在于父类和子类之间,约束继承泛滥。再来创建一个基于长方形与正方形共同的抽象——四边形 QuardRangle 接口,代码如下。

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

修改长方形 Rectangle 类的代码如下。

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

修改正方形 Square 类的代码如下。

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

此时,如果把 resize() 方法的参数换成四边形 QuardRangle 类,方法内部就会报错。因为正方形已经没有了 setWidth() 和 setHeight() 方法,所以,为了约束继承泛滥,resize() 方法的参数只能用长方形 Rectangle 类。

拓展

在讲开闭原则的时候,我们埋下了一个伏笔。在 JavaDiscountCourse 类中获取折扣价格时重写了父类的 getPrice() 方法,增加了一个获取源码的 getOriginPrice() 方法,这明显违背了里氏替换原则。

下面修改代码,增加 getDiscountPrice() 方法。JavaDiscountCourse 类代码如下:

public class JavaDiscountCourse extends JavaCourse {
public JavaDiscountCourse(Integer id, String name, Double price) {

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-9Ql2aCkP-1713617815415)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值