作为BufferedReader派生自Reader。但是在BufferedReader中,它添加了一些额外的公共方法:比如readLine(),期待您的评论提前感谢
Liskov替换原则的要点是,任何类型B
比另一类型A
衍生更多的实体,都可以用来满足类型A
实体的任何预期行为。换句话说,如果B
是A
的子类,B
的实例应该完成A
的所有期望。
这样,像A a = new B();
这样的变量赋值就不会导致任何奇怪的行为。B
的实例可以看作A
的实例,因此类型系统可以保护程序免受意外行为的影响。
但是,如果A
有一个方法foo()
,并且B
用A
实例不期望的新行为覆盖了该方法,则上述赋值(就类型系统而言是好的)仍然可能导致意外行为。
对于扩展Reader
的BufferedReader
, BufferedReader
按照预期实现了Reader
中的所有内容,只是添加了进一步的行为。如果我们使用赋值Reader reader = new BufferedReader(...);
,则该类被设计为任何使用reader
对象(Reader
的实例)的代码都不需要知道该实例是哪种Reader
(在本例中是BufferedReader
)。从BufferedReader
类中获得更多行为的事实是无关紧要的;这里我们只知道(并且只需要知道)我们有一个工作的Reader
。这样,它就满足了Liskov替换原则。
No。它不违反利斯科夫代换原则。仍然是Reader
类型。
不是,只要你不覆盖任何功能,而只是扩展它。基本上,只要你可以使用你的子类而不是父类,并且整个应用程序仍然以完全相同的方式工作,LSP就完成了。
参见:什么是Liskov替代原理?