“子类型必须可以替代它们的基类型”
假设我已经有一个 Bird 类,并且:
class Parrot extends Bird {
public function Talk() {
echo 'Talk';
}
}
鸟不会说话,所以我不能用鸟代替鹦鹉。
这只是一个基本示例,但通常扩展类可以比基类做更多的事情。我错过了什么?
最佳答案
关键是鹦鹉应该在所有方面都像鸟一样,这样那些有与鸟类打交道计划的人就不会对他们遇到的鹦鹉感到惊讶。如果鹦鹉碰巧也会说话,也没关系,因为他们的计划并不涉及让鸟儿说话。
例如,也许他们只是对他们得到的每只鸟调用 $bird->fly()
- 鹦鹉说话的能力不会干扰该事件,因此他们的算法仍然有效。但是如果你发明了一种不会飞的鸟(比如鸵鸟),那么你就违反了这个原则,他们的通用鸟类处理算法不再适用于所有种类的鸟类。
关于oop - 可以应用 Liskov 替换原则(php 示例)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8800640/