Java 这是对Liskov代换原理的正确理解吗
这是在一次采访中问我的 我回答他说,对于相同的输入集,父母和孩子应该产生相同的输出集。如果子级希望扩展父级的功能,则只能在父级支持的范围之外的新输入上进行扩展。这样,孩子将维持其父母签订的合同 我给了他一个例子,一个api可能正在使用这样的父级Java 这是对Liskov代换原理的正确理解吗,java,solid-principles,liskov-substitution-principle,Java,Solid Principles,Liskov Substitution Principle,这是在一次采访中问我的 我回答他说,对于相同的输入集,父母和孩子应该产生相同的输出集。如果子级希望扩展父级的功能,则只能在父级支持的范围之外的新输入上进行扩展。这样,孩子将维持其父母签订的合同 我给了他一个例子,一个api可能正在使用这样的父级 if(parent.getOutput(10) == 5){/*do something */} 如果这个孩子在这里产生了不同的输出,那么这个孩子就违反了它的父母签订的合同 他对我的回答不满意,并告诉我这是简单的覆盖,并不违反LSP。 所以,我只想确认
if(parent.getOutput(10) == 5){/*do something */}
如果这个孩子在这里产生了不同的输出,那么这个孩子就违反了它的父母签订的合同
他对我的回答不满意,并告诉我这是简单的覆盖,并不违反LSP。
所以,我只想确认一下,如果我理解正确的话。不,这是不正确的 Liskov替换原则的要点是,根据相关合同,子类应该能够以与父类相同的方式使用。它不需要为相同的输入生成相同的输出 在不可避免的动物主题中,以下是一个示例,其中方法为相同的输入返回不同的输出:
class Dog {
String getNoise() {
return "WOOF WOOF!!!"
}
}
class FrenchBulldog extends Dog {
String getNoise() {
return "mrfff!"
}
}
法国斗牛犬
可以在任何上下文中代表任何狗
,行为方式相同,因此不违反LSP
如果您改为创建如下内容:
class Hotdog extends Dog implements Edible {
String getNoise() {
throw new NotImplementedException("I am actually a sausage");
}
String eat() {
return "Delicious";
}
}
然后它就不能再代替狗了。与
Dog
s和FrenchBulldog
s完美配合的代码不再以应有的方式工作。无论狗狗发出什么样的噪音,任何一个狗美容师或犬舍都知道该做什么,但是如果你带了热狗,他们会非常困惑。这违反了LSP。“不可避免的动物主题”+1还有一个著名的违反LSP的例子,正方形和矩形的高度和宽度,在正方形上设置高度将宽度设置为相同的值?这只会导致不正确的结果,但并不意味着无法计算该形状的面积等。。。