BufferedReader :这种设计是否违反了 Liskov 替换原则?

BufferedReader : does this design against Liskov substitution principle?

As BufferedReader 来自 Reader。但在 BufferedReader 中,它添加了一些额外的 public 方法:例如 readLine(), 期待您的评论 提前致谢

没有。这不违反 Liskov 替换原则。还是Reader的类型。你可以替换它。

它不是,只要您不覆盖任何功能而只是扩展它。基本上,LSP 已经实现,只要您可以只使用您的子 class 而不是父 class 并且整个应用程序仍然以完全相同的方式工作。

另请参阅:What is the Liskov Substitution Principle?

Liskov Substitution Principle 的要点是任何一种类型的实体,B比另一种类型,A更派生,可用于实现 A 类型的实体所期望的任何行为。换句话说,如果 BA 的子 class,B 的实例应该完成 A.[=36 的实例所期望的一切=]

这样,像 A a = new B(); 这样的变量赋值就不会导致任何令人惊讶的行为。 B 的实例可以被视为 A 的实例,因此类型系统保护程序免受意外行为的影响。

但是,如果 A 有方法 foo(),并且 B 使用 A 的实例所不期望的新行为覆盖此方法,则上述赋值,就类型系统而言这很好,但仍然会导致意外行为。

在扩展 ReaderBufferedReader 的情况下,BufferedReader 按预期实现了 Reader 中的所有内容,并且只是添加了进一步的行为。如果我们使用赋值 Reader reader = new BufferedReader(...);,class 被设计成任何使用 reader 对象(Reader 的实例)的代码都不需要知道哪种 Reader(在本例中为 BufferedReader)实例。 BufferedReader class 提供更多行为这一事实无关紧要;在这里我们只知道(并且只需要知道)我们有一个工作 Reader。这样就满足了里氏代换原则。