关于Liskov替代原则(LSP),它声明派生类的对象可以在没有程序执行的情况下使用它的基类 - 对象。
如果我的父类是带有函数的抽象基类怎么办:
public abstract class BaseClass {
public void heal() {
health++;
}
}
我可以覆盖派生类中的heal方法,它仍然对LSP原理有效,例如:
public class ChildClass extends BaseClass {
@Override public void heal() {
super.heal();
super.heal();
}
Programm仍然会执行,我可以将ChildClass-Objects传递给一个期望BaseClass-Object作为参数的方法。但是,两种heal()方法的行为略有不同。
我可以在不损害LSP的情况下覆盖子类中抽象基类的具体方法吗?
答案 0 :(得分:3)
只要遵守基类契约,就可以在派生类方法中实现任何逻辑。合同是由类及其方法提供的保证,通常在文档中描述。有些语言提供更正式的合同规范,例如编译时断言。方法签名也可以被视为合同的一部分。
如果您的heal
方法记录为“向对象的健康状况添加一个点”,那么使用您的BaseClass
的其他类依赖于仅添加一个点。在这种情况下,覆盖heal
以向健康添加任何其他金额会破坏合同并违反LSP。
相反,如果heal
是一种“为对象的健康添加一些点”的方法,那么其他类不允许对实际增加的数量做出任何建议 - 他们唯一可以依赖的例如,在调用此方法之后,health
在调用health
之前不小于heal
。在这种情况下,您的覆盖不会违反LSP并且不会破坏程序。