可以应用Liskov替换原则(php示例)吗?

时间:2012-01-10 08:55:22

标签: oop solid-principles

“子类型必须可替代其基类型”

假设我已经有了Bird课程,并且:

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

一只鸟不能说话,所以我无法用鸟取代鹦鹉。

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

1 个答案:

答案 0 :(得分:11)

关键是鹦鹉在任何方面都应该像鸟一样行动,因此有一般计划与鸟类打交道的人不会对他们遇到的鹦鹉感到惊讶。如果鹦鹉碰巧能够说话,那也没关系,因为他们的计划不涉及让鸟儿说话。

例如,也许他们只是在他们得到的每只鸟上调用$bird->fly() - 鹦鹉说话的能力不会破坏这种活动,所以他们的算法仍然有效。但是如果你发明了一种无法飞行的鸟(比如说是鸵鸟),那么你就违反了这个原则,它们的一般鸟类处理算法不再适用于各种鸟类。