我正在开发一个简单的项目。在我的项目中,我与利斯科夫原则的含义存在冲突。
我用这个例子简化了我的项目问题:
public class Animal {
public void feed() {
// do something here
}
}
public class Dog extends Animal {
// some methods and attributes
@Override
public void feed() {
// never call parent feed() method (super.feed())
}
}
所以,我的问题是,如果我不调用父方法并在覆盖方法中写一个全新的代码,这是否违反Liskov原则?
谢谢。
不,只要子类的实现满足基类的期望,它就不会违反Liskov原则。
LSP原则是关于合同,当你有动物实例或从某人那里得到它并尝试喂它时你认为狗做它应该做的事情而不是例子飞走或试图杀死你。实现动物合同的正确狗实施应适合所有期望动物的地方。当狗做一些奇怪的事情(不合同的事情)时,它违反了LSP。在履行合同时,你如何实现狗的方法与LSP的上下文无关。
可替代性是面向对象编程中的一个原则,指出在计算机程序中,如果S是T的子类型,则类型T的对象可以用类型S的对象替换(即,类型T的对象可以用任何类型替换。子类型S)的对象,而不改变T的任何所需属性(正确性,执行的任务等)。