php设计模式的六大原则(三):里氏替换原则

<?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)


看了第二个例子,有人会说那岂不是和重载矛盾了。初看是有点,但仔细理解,并不矛盾,我们可以这样处理矛盾:

//例子2

class A{
    protect function add($a, $b){
        return $a + $b;
    }
}

//重载
class B extends A{

    protected function add($a, $b, $c){
        return isset($c) ? $a + $b + 100 : $a + $b;
    }
}

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

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

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

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

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


你可能感兴趣的:(php设计模式的六大原则(三):里氏替换原则)