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

标签 oop solid-principles

“子类型必须可以替代它们的基类型”

假设我已经有一个 Bird 类,并且:

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

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

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

最佳答案

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

例如,也许他们只是对他们得到的每只鸟调用 $bird->fly() - 鹦鹉说话的能力不会干扰该事件,因此他们的算法仍然有效。但是如果你发明了一种不会飞的鸟(比如鸵鸟),那么你就违反了这个原则,他们的通用鸟类处理算法不再适用于所有种类的鸟类。

关于oop - 可以应用 Liskov 替换原则(php 示例)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8800640/

相关文章:

oop - 一个对象拒绝它自己是正确的吗?

.net - .NET 的 List(Of T).Reverse 方法的范围

C# 接口(interface)转换是否违反了 Liskov 替换原则

c# - 我应该违反 SOLID 中的 S 还是应该违反 DRY 原则?

c# - 我的 Mapper 类应该注入(inject)我的 Controller 还是直接实例化它?

java - 具有不同类型和数据的事件

php - 聚合和存储库。如何确定总量?

java - Java 中的地址簿

oop - "Open/closed principle"和 "Dependency inversion principle"有什么区别?

oop - OOP基础与SOLID之间的区别?