在子類繼承父類時,類中的方法需要保證與父類的行為預期一致
好的繼承:
<?php
abstract class Animal
{
public function makeSound()
{
echo 'Make some sound';
}
}
class Cat extends Animal
{
public function makeSound()
{
echo 'Meow~ Meow~';
}
}
function makeAnimalSounds(Animal $animal)
{
$animal->makeSound();
}
makeAnimalSounds(new Cat());
在子類覆寫父類的方法時,與其行為預期表現一致,不會導致程式產生意外的錯誤。
<?php
abstract class Animal
{
public function makeSound()
{
echo 'Make some sound';
}
}
class Dog extends Animal
{
public function makeSound()
{
throw new Exception("I can't make sound");
}
}
function makeAnimalSounds(Animal $animal)
{
$animal->makeSound();
}
makeAnimalSounds(new Dog());
子類的 makeSound()
方法返回值與父類不一致,容易產生意外的 Bug。
里氏替換原則最終的目的是「子類」可以完全替代「父類」,這就意味著子類的方法實現的功能要和父類一致。
換言之:子類的方法應該具有與父類相同的輸入和輸出,即使是 Bug,也要一模一樣。
本作品採用《CC 協議》,轉載必須註明作者和本文連結