里氏替換原則

MArtian發表於2023-08-13

在子類繼承父類時,類中的方法需要保證與父類的行為預期一致

好的繼承:

<?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 協議》,轉載必須註明作者和本文連結
我從未見過一個早起、勤奮、謹慎,誠實的人抱怨命運。

相關文章