zoukankan      html  css  js  c++  java
  • 里氏替换原则

    里氏替换原则

    定义:

    第一种:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。

    解释:类型S是类型T的子类型,这不是说的继承关系吗,其表达的含义是在程序P中,T的对象都能被S的对象替代。

    第二种:所有引用基类的地方必须能透明地使用其子类的对象。

    里氏替换原则本质是对继承的约束。使其项目中更好的应用继承。

    主要体现:

    1.子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法。

    2.子类中可以增加自己特有的方法。

    3.当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

    4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

    在我们做系统设计时,经常会设计接口或抽象类,然后由子类来实现抽象方法,这时我们要遵守里氏替换原则。若子类不完全对父类的方法进行实例化,那么这个接口或抽象类存在有何意义

    第一条规定,子类不能覆写父类已实现的方法。父类中已实现的方法其实是一种已定好的规范和契约,如果我们随意的修改了它,那么可能会带来意想不到的错误。

    案例:

     

    运行结果:
    父类的运行结果
    2
    子类替代父类后的运行结果
    0

    案例:子类重载了父类的方法。因为子类和父类的方法的输入参数是不同的。子类方法的参数Map比父类方法的参数HashMap的范围要大,所以当参数输入为HashMap类型时,只会执行父类的方法遵守里氏替换原则。

     

    运行结果:
    父类被执行
    父类被执行

    如果我们将子类的方法缩小又是什么场景。

     

    运行结果:
    父类被执行
    子类被执行

    在父类方法没有被重写的情况下,子方法被执行了,这样就引起了程序逻辑的混乱。所以子类中方法的前置条件必须与父类中被覆写的方法的前置条件相同或者更宽松。

    最后一条:若在继承时,子类的方法返回值类型范围比父类的方法返回值类型范围大,在子类重写该方法时编译器会报错。

     

     

  • 相关阅读:
    nyoj67三角形面积
    hduoj1097A hard puzzle
    nyoj168房间安排
    nyoj73 比大小
    hduoj1021 Fibonacci Again
    hduoj1018 Big Number
    hduoj1108最小公倍数
    nyoj312 20岁生日
    hduoj1019 Least Common Multiple
    nyoj144小珂的苦恼
  • 原文地址:https://www.cnblogs.com/jikjk/p/10507594.html
Copyright © 2011-2022 走看看