• 面向对象之里氏替换原则


    里氏替换原则(Liskov Substitution Principle)

    里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

    使用里氏替换原则时需要注意,子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。

    通过一段代码了解 

    <?php
     
    //例子1
    class Bird{
     
        protect function fly(){
         
        }
    }
    //翠鸟
    class KingFisher extends Bird{
     
    }
     
    //鸵鸟
    class Ostrich extends Bird{
        //鸵鸟不会飞啊
    }
     
    //例子2
     
    class A{
        protect function add($a, $b){
            return $a + $b;
        }
    }
     
    //重载
    class B extends A{
     
        protected function add($a, $b){
            return $a + $b + 100;
        }
    }
    ?>

    里氏替换原则是对类继承的一种约束。对里氏替换原则有两种理解:

    1. 不能随便去继承不合适的,有多余方法或者属性的类。(例子1)

    2. 子类可以扩展父类的功能,但不能改变父类原有的功能。(例子2) 

    里氏替换原则包含一下几个隐藏含义:

    • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

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

    • 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

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

  • 相关阅读:
    自定义类型中结构体、枚举等,结构体内存对齐相关要点总结
    可变参数模拟printf()函数实现一个my_print()函数以及调用可变参数需注意的陷阱
    一些关于memcpy memmove函数的区别,和模拟实现
    浅谈 数组指针 指针数组 函数指针 函数指针数组... 以及它们之间区别。
    C语 三子棋小游戏
    5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
    stm32移植ds18b20时出现的问题
    自己实现strcmp
    C语言新手写扫雷攻略3
    C语言新手写扫雷攻略2
  • 原文地址:https://www.cnblogs.com/wangxusummer/p/5250798.html
Copyright © 2020-2023  润新知