里氏替换原则的初步理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fangxinde/article/details/83653958

学习里氏替换原则相关定义及解释时,给人似懂非懂的感觉,就是不能很清晰的理解此原则的内涵:

书中有句话:【只要父类出现的地方,子类都可以替换他,使用者可能都不知道到底是子类还是父类】

为了达到这个目的,我们需要注意以下几点:

  • 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
  • 子类中可以增加自己特有的方法。
  • 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
  • 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

其中第一条中:为啥不能覆盖父类的非抽象方法呢?

我们可以通俗的讲,子类都覆盖了父类的方法,那继承父类还有啥意义呢?可以直接重写一个类了。

其实以上几个条件的设置的最终目的就是保持父类中非抽象方法不被覆盖,重写。

为什么要这么做?这么做有什么好处?这样做要注意哪些事项?

若子类覆盖了父类,父类出现的地方,用子类替换父类,最终调用的却是子类中方法,这就违反了里氏替换原则。

因为父类出现的地方,调用的肯定是父类的中方法,若用子类替换,调用的还是父类中的方法或者是子类实现父类中抽象方法(满足父类功能约束),这才符合里氏替换原则。

这样替换有什么优势呢?

 这涉及到类型上溯和动态绑定的特性了。调用某个子类,以其父类为形参类型,子类通过此形参进行值传递,进行类型上溯,然后调用上溯后类中的方法时,java能动态绑定到具体的子类中方法,但动态绑定方法是有条件的,这个条件就是上面讲得四点。

        一个父类有多个子类,每个子类都能有自已特有的业务,但这些子类都可以通过父类类型形参进行传递而实现业务功能,从而实现代码的健壮性、复用性、降低耦合性及易于扩充功能、。

       

猜你喜欢

转载自blog.csdn.net/fangxinde/article/details/83653958