BufferedReader:这个设计违背了Liskov替换原则



作为BufferedReader派生自Reader。但是在BufferedReader中,它添加了一些额外的公共方法:比如readLine(),期待您的评论提前感谢

Liskov替换原则的要点是,任何类型B 比另一类型A衍生更多的实体,都可以用来满足类型A实体的任何预期行为。换句话说,如果BA的子类,B的实例应该完成A的所有期望。

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

但是,如果A有一个方法foo(),并且BA实例不期望的新行为覆盖了该方法,则上述赋值(就类型系统而言是好的)仍然可能导致意外行为。

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

No。它不违反利斯科夫代换原则。仍然是Reader类型。

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

参见:什么是Liskov替代原理?

最新更新