里式替换原则

Posted 我想月薪过万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了里式替换原则相关的知识,希望对你有一定的参考价值。

里式替换原则 主要有以下三点内容:

  • 从方法的角度:子类不应该改变父类原有方法的逻辑。
  • 从方法参数的角度:子类方法参数应该比父类方法参数范围大。
  • 从方法返回值的角度:子类方法返回值应该比父类方法返回值范围小。

代码示例

从方法的角度,这句话很好理解,我们不做过多解释,我们直接来看从方法参数的角度

父类:参数范围大

package Ls;

import java.util.Map;

/**
 * ClassName: LsParent <br/>
 * Description: <br/>
 * date: 2021/6/28 20:46<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class LsParent {
    public void LsTest(Map map){
        System.out.println("父类打印了");
    }
}

 子类:参数范围小

package Ls;

import java.util.HashMap;

/**
 * ClassName: LsChild <br/>
 * Description: <br/>
 * date: 2021/6/28 20:49<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class LsChild extends LsParent{

    public void LsTest(HashMap hashMap) {
        System.out.println("子类打印了");
    }
}

主函数

package Ls;

import java.util.HashMap;

/**
 * ClassName: Main <br/>
 * Description: <br/>
 * date: 2021/6/28 20:51<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class Main {
    public static void main(String[] args) {
        LsChild lsOne = new LsChild(); //打印结果会随着 LsChild/LsParent 的不同而不同
        HashMap<String,String> hashMap = new HashMap<>();
        lsOne.LsTest(hashMap);
    }
}

在主函数中 lsOne 的类型为 LsChild 时, 打印 “子类打印了”;为 LsParent 是 ,打印 “父类打印了”,这种情况肯定是我们不希望的,所以,你得满足 子类方法参数应该比父类方法参数范围大 的条件。再打印就只会打印 “父类打印了”。

从方法返回值的角度,编译器比较智能,不满足 子小父大 的条件会报错

以上是关于里式替换原则的主要内容,如果未能解决你的问题,请参考以下文章

里式替换原则——面向对象程序设计原则

里式替换原则——面向对象程序设计原则

里式替换原则

搞定里式替换原则的设计模式一篇文章就够了!!!

Java设计模式6大原则

「设计模式」六大原则之三:里氏替换原则小结