那些你要知道的设计原则之-里氏替换

1.定义

1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
5.子类对象能够替换其父类对象被使用,并且程序不受影响。

2.作用

  • 子类可以继承父类的非私有方法,又可以有自身的属性。
  • 减少子类的工作量,提高代码重用性
  • 加强程序的健壮性,同时版本升级也可以做到非常好的兼容性
  • 规范继承关系

3.案例

B继承A

public class A {
}
public class B extends A {
}

Son 继承 Father 并且重载是重载父类的makeMoney方法,这里遵循里氏替换原则,子类的makeMoney方法的参数类型限制比父类的更宽松

//父类
public class Father {

    public void makeMoney(B b) {
            System.out.println("父亲赚钱");
    }

}
//子类
public class Son extends Father {

    public void makeMoney(A a) {
        System.out.println("儿子赚钱");
    }
}

编写一个Main类,写一个测试函数main方法,创建Father 类调用makeMoney方法

public class Main {

    public static void main(String[] args) {
        Father son = new Father();
        son.makeMoney(new B());
    }
}

执行结果为:
父亲赚钱
根据里式替换法则子类对象能够替换其父类对象被使用,并且程序不受影响。我们程序修改如下

public class Main {

    public static void main(String[] args) {
        Son son = new Son(); //替换对象
        son.makeMoney(new B());
    }
}

执行结果一样
这就是里式替换法则子类对象能够替换其父类对象被使用,如果想让子类的方法执行,可以重写父类的makeMoney方法或者把上段代码中new B()改为new A()调用自己的业务逻辑。这样做的好处比如在版本升级的时候,具备更好的兼容性,之前的版本照样可以运行,不受影响。

但如果把程序修改为如下,加大父类的参数范围,缩小子类的参数范围。

public class Father {
    //加大参数范围
    public void makeMoney(A a) {
            System.out.println("父亲赚钱");
    }

}
public class Son extends Father {
    //缩小参数范围
    public void makeMoney(B b) {
        System.out.println("儿子赚钱");
    }
}
public class Main {

    public static void main(String[] args) {
        Son son = new Son();
        son.makeMoney(new B());
    }
}

执行结果为:儿子赚钱
在没有重写父类方法的情况下,直接执行了自己的方法。这样的做法使程序过于生硬不够灵活,不利于子类的扩展,并且不能兼容之前的业务逻辑

4.总结

里式替换原则在项目中是非常常见的,通过传递不同的子类实现不同的业务逻辑。遵循这样的原则可以增强程序的健壮性和扩展性,反之业务逻辑混乱,不兼容

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,263评论 1 44
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 在学习java类的继承时,我们知道继承有一些优点: 子类拥有父类的所有方法和属性,从而可以减少创建类的工作量。 提...
    爱一直在线阅读 11,903评论 0 14
  • 期待每个黎明————王林梅 假如,我瘫痪了,每天唯一能做的事就是躺在床上,需要别人帮我翻身,需要别人喂我...
    小辉辉xhh阅读 1,062评论 0 0
  • 你上一次情绪崩溃是什么时候? 上个月。 爸爸有天打来电话说妈妈最近身体不太好,整夜整夜都难以入睡,更年期的焦虑加上...
    陈十七爱吃肉阅读 802评论 1 5