1. 概念
里氏替换原则通俗地讲就是:子类可以扩展父类的功能,但是不能修改父类原有的功能。也就是说子类继承父类的时候,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方可能会出现错误。例如继承类重写了基类的某个方法,在程序中通过基类访问继承类的方法,但是继承类重写的方法与基类中该方法的行为不一致。解决方法就是解除原来的继承关系,重新设计他们的关系。
2. 主要思想
里氏替换原则的主要思想是:继承必须确保超类所拥有的性质在子类中仍然成立。
3. 原则
里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,里氏替换原则是继承复用的基础,它反映了基类和子类的关系。
4. 作用
里氏替换原则的作用:
- 克服了继承中重写父类造成的可复用性变差的缺点。
- 保证了动作的正确性。即类的扩展不会给已有的系统引入新的错误。
5. 案例分析
5.1 错误示范
下面通过“鸵鸟不会飞”的例子来具体理解里氏替换原则。鸵鸟虽然属于鸟类,但是不能飞,只能跑。
图示:
代码如下:
//鸟类
class Bird {
private double flySpeed;
public void setFlySpeed(double speed) {
flySpeed = speed;
}
public double getFlyTime(double distance) {
return distance / flySpeed;
}
}
//燕子类
class Swallow extends Bird {
}
//鸵鸟类
class Ostrich extends Bird{
//由于鸵鸟不能飞行,因此我们需要重写setSpeed方法,将飞行速度设置为0。
public void setSpeed(double speed)
{
flySpeed=0;
}
}
//测试类
public class Test {
public static void main(String[] args) {
Bird swallow = new Swallow();
Bird ostrich = new Ostrich();
swallow.setFlySpeed(120);
ostrich.setFlySpeed(120);
System.out.println(swallow.getFlyTime(300));
System.out.println(ostrich.getFlyTime(300));
}
}
运行结果:
2.5
编译报错
程序运行不符合预期的原因是违背了里氏替换原则,正确的做法应该是取消几维鸟原来的继承关系,定义鸟和几维鸟更一般的父类,如动物类。