设计原则 里氏替换原则
通俗的定义:子类可以扩展父类的功能,但不能改变父类原有的功能。
覆盖或实现父类方法时可以放大输入参数
在一个继承中,如果子类传入的参数小于或等于父类参数时,那么此方法在执行时,会永远调用父类的方法,而不会调用子类中的方法,因为这是重载,父类中的方法还存在,没有被替换掉。
如果大于父类传入参数,会使得我们想要执行子类方法时,传入一个较大的参数来进行调用,这样既不会破坏继承性,也能保证程序良好的运行。如下图例子
public class Father{ public Collection doSomething(HashMap map) { System.out.println("父类被执行..."); return map.values(); } } // 子类 public class Son extends Father { // 子类放大了输入参数类型 public Collection doSomething(Map map) { System.out.println("子类被执行..."); return map.values(); } }
public class Client { public static void main(String[] args) { Son s=new Son(); HashMap map = new HashMap();//传入这个参数,调用的是父类中的方法 Map map=new Map();//传入这个参数,调用的是子类中的方法 f.doSomething(map); } }
覆写或者实现父类方法时可以缩小输出结果
里氏替换原则要求,子类中方法的返回值类型必须小于或者等于被重写的父类抽象方法的返回值类型:
public abstract class Computer { public abstract void use(); } class IBM extends Computer{ @Override public void use() { System.out.println("use IBM Computer."); } } class HP extends Computer{ @Override public void use() { System.out.println("use HP Computer."); } }
这样的话,会使的业务逻辑更加的具体。
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义:
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
- 子类中可以增加自己特有的方法。
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。