//例子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)
子类可以扩展父类的功能,但不能改变父类原有的功能。(例子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;
}
}
里氏替换原则包含一下几个隐藏含义:
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。