2012-01-10 54 views
2

「子類型必須爲替代他們的基本類型」Can Liskov替代原則應用(php示例)?

比方說,我有一個鳥類已經和:

class Parrot extends Bird { 
    public function Talk() { 
    echo 'Talk'; 
    } 
} 

一隻鳥不會說話,所以我不能代替鸚鵡用鳥。

這只是一個基本的例子,但通常擴展類可以做更多的基類。我錯過了什麼?

回答

11

問題是鸚鵡應該在各方面都像鳥一樣行動,這樣一個有計劃地處理鳥類的人一般不會被他們碰到的鸚鵡感到驚訝。如果鸚鵡碰巧能夠說話,這並不重要,因爲他們的計劃不涉及要求鳥類說話。

例如,也許他們只需撥打$bird->fly()就可以得到它們的每隻小鳥 - 鸚鵡說話的能力不會中斷該活動,所以他們的算法仍然有效。但是,如果你發明了一種不能飛翔的鳥類(比如說鴕鳥),那麼你違反了這個原則,而且他們的一般的鳥類處理算法不再適用於各種鳥類。

相關問題