里氏替换原则
定义
继承必须确保超类所拥有的性质在子类中仍然成立
里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
作用
- 实现开闭原则的重要方式之一
- 克服了继承中重写父类造成可复用性变差的缺点
- 动作正确性的保证,即类的扩展不会引入新的错误,降低代码出错的可能性
实现方法
通俗来讲,子类可以扩展父类功能,但不能改变父类原有的功能。
如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方会出现运行错误。这时其修正方法是:取消原来的继承关系,重新设计它们之间的关系。
举例:
package principle;
public class LSPtest
{
public static void main(String[] args)
{
Bird bird1=new Swallow();
Bird bird2=new BrownKiwi();
bird1.setSpeed(120);
bird2.setSpeed(120);
System.out.println("如果飞行300公里:");
try
{
System.out.println("燕子将飞行"+bird1.getFlyTime(300)+"小时.");
System.out.println("几维鸟将飞行"+bird2.getFlyTime(300)+"小时。");
}
catch(Exception err)
{
System.out.println("发生错误了!");
}
}
}
//鸟类
class Bird
{
double flySpeed;
public void setSpeed(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;
}
}