里氏代换原则的定义是——子类型必须能够替换掉他们的父类型。
在学习类的继承时有一个概念,如果子类继承自父类,那么子类就应该能以父类的身份出现。简单说,如果一个软件实体使用的是一个父类的话,那么就肯定适用其子类,并且该软件实体察觉不到父类对象和子类对象的区别。
举个例子,有个很厉害的老木匠,周边的邻居都找他做家具,老木匠还有个大徒弟,不但学全了老木匠的本事还青出于蓝而胜于蓝。后来老木匠干不动了,所以每次有人找上门来都是老木匠接活儿,大徒弟去做家具,而对做家具的人来说,他们并不关心具体谁做的,只要能拿到家具就好。
/**
* Author:小青
* Time:2017-8-27
* Function:老木匠
*
*/
public class OldCarpenter{
public void MakeFurniture(){
System.out.println("做家具");
}
}
/**
* Author:小青
* Time:2017-8-27
* Function:大徒弟
*
*/
public class YoungFurniture extends oldCarpenter{
@Override
public void MakeFurniture(){
super.MakeFurniture();
System.out.println("对家具进行装饰");
}
}
public class Client{
public sttaic void main(String[] args){
OldCarpenter carpenter = new OldCarpenter();
System.out.println("原来老木匠做椅子");
carpenter.MakeFurniture();
System.out.println("后来老木匠接活儿让徒弟来做");
carpenter = new YoungFurniture();
}
}
在这个过程中,邻居们并没有发现是谁做的家具,徒弟替代了师傅。
只有在满足了里氏替换原则之后,也就是子类可以代替父类出现,并且不影响程序的功能时,父类才能真正得到复用,并且子类可以在父类的基础上添加新的行为,面向对象思想中,父类和子类的继承关系是抽象化的具体实现。
里氏替换原则(Liskov Substitution Principle ,LSP)反映了父类和子类的关系。里氏代换原则的面向对象设计中最重要也是最基本的原则之一,是对实现类的抽象化实施步骤的规范。
以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载.