里氏替换原则的主要思想是:继承必须确保超类所拥有的性质在子类中仍然成立。
里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,里氏替换原则是继承复用的基础,它反映了基类和子类的关系。
里氏替换原则的作用:克服了继承中重写父类造成的可复用性变差的缺点。
保证了动作的正确性。即类的扩展不会给已有的系统引入新的错误。
里氏替换原则通俗地讲就是:子类可以扩展父类的功能,但是不能父类原有的功能。也就是说子类继承父类的时候,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方可能会出现错误。例如继承类重写了基类的某个方法,这程序中通过基类访问继承类的方法,但是继承类重写的方法与基类中该方法的行为不一致。解决方法就是解除原来的继承关系,重新设计他们的关系。
下面通过“几维鸟不是鸟”的例子来具体理解里氏替换原则。
几维鸟虽然属于鸟类,但是由于翅膀退化不能飞。
鸟类代码:
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 BrownKiwi extends Bird
{
public void setSpeed(double speed)
{
flySpeed=0;
}
}
由于几维鸟不能飞行,因此我们需要重写setSpeed方法,将飞行速度设置为0。
主方法:
public class Liskov {
public static void main(String[] args) {
Bird swallow = new Swallow();
Bird brownKiwi = new BrownKiwi();
swallow.setFlySpeed(120);
brownKiwi.setFlySpeed(120);
System.out.println(swallow.getFlyTime(300));
System.out.println(brownKiwi.getFlyTime(300));
}
}
输出:
程序运行不符合预期的原因是违背了里氏替换原则,正确的做法应该是取消几维鸟原来的继承关系,定义鸟和几维鸟更一般的父类,如动物类。里氏替换原则--面向对象设计原则c.biancheng.net