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 修改为正确方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

很萌の萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值