2012-01-10 53 views
2

“子类型必须为替代他们的基本类型”Can Liskov替代原则应用(php示例)?

比方说,我有一个鸟类已经和:

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

一只鸟不会说话,所以我不能代替鹦鹉用鸟。

这只是一个基本的例子,但通常扩展类可以做更多的基类。我错过了什么?

回答

11

问题是鹦鹉应该在各方面都像鸟一样行动,这样一个有计划地处理鸟类的人一般不会被他们碰到的鹦鹉感到惊讶。如果鹦鹉碰巧能够说话,这并不重要,因为他们的计划不涉及要求鸟类说话。

例如,也许他们只需拨打$bird->fly()就可以得到它们的每只小鸟 - 鹦鹉说话的能力不会中断该活动,所以他们的算法仍然有效。但是,如果你发明了一种不能飞翔的鸟类(比如说鸵鸟),那么你违反了这个原则,而且他们的一般的鸟类处理算法不再适用于各种鸟类。

相关问题