快速理解 SOLID (面向对象设计)——里氏替换原则
在程序设计领域,SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转),指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。
1. 里氏替换原则
1.1 里氏替换原则 的定义
里氏替换原则 这个名字使很多人产生了疑惑,其实 里氏替换原则 是由麻省理工学院的一位 姓里的女士 提出来的。
派生类(子类)对象可以在程式中代替其基类(父类)对象。
1.2 里氏替换原则 解决了什么问题
职责 P 是由 类 A 实现的,现在需要对 职责 P 进行扩展,扩展为 职责 P +。而 职责 P +由 类 A 的 子类 B 实现,则在 子类 B 完成 职责 P +后,有可能破坏了原有的 职责 P 。
1.3 里氏替换原则 举个例子
public class User {
// 增加积分
public void addCount(){this.count = this.count + 10;}
}
上面这个 User
类可以看作有一个职责:用户增加积分。
而现在要求 VIP 用户不但增加积分而且增加经验:
// 不符合 里氏替换原则
public class VIPUser extends User{
// 增加积分而且增加经验
public void addCount(){
this.count = this.count + 10;
this.experience = this.experience + 10;
}
}
上面这个 VIPUser
类通过重写来实现增加积分职责的扩展,但是也破坏了原有的增加积分职责。如果将使用 User
类的地方替换为 VIPUser
类,会因为 addCount
函数发生改变而产生错误。所以不符合 里氏替换原则。
// 符合 里氏替换原则
public class VIPUser extends User{
// 增加积分而且增加经验
public void addCountVIP(){super.addCount();
this.experience = this.experience + 10;
}
}
上面这个 VIPUser
类通过调用父类方法来实现增加积分职责的扩展,没有破环原有的增加积分职责。而且任何使用 User
类的地方都可以替换为 VIPUser
类。所以符合 里氏替换原则。
1.4 里氏替换原则 的总结
子类可以扩展父类的功能,但不能改变父类原有的功能。
2. 关注我的微信公众号,查看更多文章,第一时间收到我的文章。
SOLID (面向对象设计)——里氏替换原则,你学会了吗?