快速理解 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 (面向对象设计)——里氏替换原则,你学会了吗?