Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是对Liskov代换原理的正确理解吗_Java_Solid Principles_Liskov Substitution Principle - Fatal编程技术网

Java 这是对Liskov代换原理的正确理解吗

Java 这是对Liskov代换原理的正确理解吗,java,solid-principles,liskov-substitution-principle,Java,Solid Principles,Liskov Substitution Principle,这是在一次采访中问我的 我回答他说,对于相同的输入集,父母和孩子应该产生相同的输出集。如果子级希望扩展父级的功能,则只能在父级支持的范围之外的新输入上进行扩展。这样,孩子将维持其父母签订的合同 我给了他一个例子,一个api可能正在使用这样的父级 if(parent.getOutput(10) == 5){/*do something */} 如果这个孩子在这里产生了不同的输出,那么这个孩子就违反了它的父母签订的合同 他对我的回答不满意,并告诉我这是简单的覆盖,并不违反LSP。 所以,我只想确认

这是在一次采访中问我的

我回答他说,对于相同的输入集,父母和孩子应该产生相同的输出集。如果子级希望扩展父级的功能,则只能在父级支持的范围之外的新输入上进行扩展。这样,孩子将维持其父母签订的合同

我给了他一个例子,一个api可能正在使用这样的父级

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";
  }
}

然后它就不能再代替狗了。与Dogs和FrenchBulldogs完美配合的代码不再以应有的方式工作。无论狗狗发出什么样的噪音,任何一个狗美容师或犬舍都知道该做什么,但是如果你带了热狗,他们会非常困惑。这违反了LSP。

“不可避免的动物主题”+1还有一个著名的违反LSP的例子,正方形和矩形的高度和宽度,在正方形上设置高度将宽度设置为相同的值?这只会导致不正确的结果,但并不意味着无法计算该形状的面积等。。。