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
类型的实体所期望的任何行为。换句话说,如果 B
是 A
的子 class,B
的实例应该完成 A
.[=36 的实例所期望的一切=]
这样,像 A a = new B();
这样的变量赋值就不会导致任何令人惊讶的行为。 B
的实例可以被视为 A
的实例,因此类型系统保护程序免受意外行为的影响。
但是,如果 A
有方法 foo()
,并且 B
使用 A
的实例所不期望的新行为覆盖此方法,则上述赋值,就类型系统而言这很好,但仍然会导致意外行为。
在扩展 Reader
的 BufferedReader
的情况下,BufferedReader
按预期实现了 Reader
中的所有内容,并且只是添加了进一步的行为。如果我们使用赋值 Reader reader = new BufferedReader(...);
,class 被设计成任何使用 reader
对象(Reader
的实例)的代码都不需要知道哪种 Reader
(在本例中为 BufferedReader
)实例。 BufferedReader
class 提供更多行为这一事实无关紧要;在这里我们只知道(并且只需要知道)我们有一个工作 Reader
。这样就满足了里氏代换原则。
As BufferedReader 来自 Reader。但在 BufferedReader 中,它添加了一些额外的 public 方法:例如 readLine(), 期待您的评论 提前致谢
没有。这不违反 Liskov 替换原则。还是Reader
的类型。你可以替换它。
它不是,只要您不覆盖任何功能而只是扩展它。基本上,LSP 已经实现,只要您可以只使用您的子 class 而不是父 class 并且整个应用程序仍然以完全相同的方式工作。
另请参阅:What is the Liskov Substitution Principle?
Liskov Substitution Principle 的要点是任何一种类型的实体,B
,比另一种类型,A
更派生,可用于实现 A
类型的实体所期望的任何行为。换句话说,如果 B
是 A
的子 class,B
的实例应该完成 A
.[=36 的实例所期望的一切=]
这样,像 A a = new B();
这样的变量赋值就不会导致任何令人惊讶的行为。 B
的实例可以被视为 A
的实例,因此类型系统保护程序免受意外行为的影响。
但是,如果 A
有方法 foo()
,并且 B
使用 A
的实例所不期望的新行为覆盖此方法,则上述赋值,就类型系统而言这很好,但仍然会导致意外行为。
在扩展 Reader
的 BufferedReader
的情况下,BufferedReader
按预期实现了 Reader
中的所有内容,并且只是添加了进一步的行为。如果我们使用赋值 Reader reader = new BufferedReader(...);
,class 被设计成任何使用 reader
对象(Reader
的实例)的代码都不需要知道哪种 Reader
(在本例中为 BufferedReader
)实例。 BufferedReader
class 提供更多行为这一事实无关紧要;在这里我们只知道(并且只需要知道)我们有一个工作 Reader
。这样就满足了里氏代换原则。