设计模式之里式替换原则详解

里式替换原则

什么是里式替换原则?

  • 定义一:所有引用基类的地方能透明的使用其子类的对象
  • 定义二:如果对每一个类型为T1的对象O1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都代换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
  • 直白点:可以将一个基类对象替换成其子类的对象,程序不会产生任何的异常和报错,但是反过来就不行。不能将子类对象替换成基类对象。就好像,我喜欢动物,所以一定会喜欢狗,但是反过来就不行(这里不许较真,只是做个比方)。

在使用里式替换时,如果不小心,就容易发生以下的错误。

问题:如果我原来有一个类A,后来有一个类B,类B继承A,并且重写了类A中的方法,这时候,就有可能会出现导致原来的程序出现错误。
案例:
类A

class A{
    public int func1(int a, int b){
        return a-b;
  }

运行类A

public class Client{
    public static void main(String[] args){
        A a = new A();
        System.out.println("100-50="+a.func1(100, 50));
        System.out.println("100-80="+a.func1(100, 80));
    }
}

运行结果:

100-50=50
100-80=20

类B

class B extends A{
    public int func1(int a, int b){
        return a+b;
    }
    
    public int func2(int a, int b){
        return func1(a,b)+100;
    }
}

运行类B

public class Client{
    public static void main(String[] args){
        B b = new B();
        System.out.println("100-50="+b.func1(100, 50));
        System.out.println("100-80="+b.func1(100, 80));
        System.out.println("100+20+100="+b.func2(100, 20));
    }
}

运行结果:

100-50=150
100-80=180
100+20+100=220

我们发现原本运行正常的相减功能发生了错误。原因就是类B在给方法起名时无意中重写了父类的方法,造成所有运行相减功能的代码全部调用了类B重写后的方法,造成原本运行正常的功能出现了错误。

原因:

https://www.cnblogs.com/qingmuchuanqi48/articles/14984315.html
里式替换的原则
子类可以拓展父类的方法,但是不能改变父类原有的功能

posted @ 2021-07-08 00:31  King-DA  阅读(211)  评论(0)    收藏  举报