Java设计模式 里氏替换原则

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
编译报错

程序运行不符合预期的原因是违背了里氏替换原则,正确的做法应该是取消几维鸟原来的继承关系,定义鸟和几维鸟更一般的父类,如动物类。

5.2 修改为正确方式

猜你喜欢

转载自blog.csdn.net/liulei952413829/article/details/114947495