Oop “Java LSP”;派生对象可以替换基本对象“;

Oop “Java LSP”;派生对象可以替换基本对象“;,oop,liskov-substitution-principle,Oop,Liskov Substitution Principle,关于Liskov替换原则(LSP),它指出派生类的对象可以替换它的基类对象,而不会使程序无法执行 如果我的父类是带函数的抽象基类,该怎么办 public abstract class BaseClass { public void heal() { health++; } } 我是否可以在派生类中重写heal方法,并且该方法对LSP原则仍然有效,例如: public class ChildClass extends BaseClass { @Overrid

关于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();
}
程序仍将执行,我可以将ChildClass对象传递给一个方法,该方法需要一个基类对象作为参数。但是,这两种heal()方法的行为略有不同


我能在不损害LSP的情况下覆盖子类中抽象基类的具体方法吗?

只要遵守基类契约,就可以在派生类方法中实现任何逻辑。契约是由类及其方法提供的担保,通常在文档中描述。有些语言提供更形式化的契约规范,例如编译时断言。方法签名也可被视为合同的一部分

如果您的
heal
方法被记录为“向对象的健康状况添加一个点”,那么使用
基类的其他类只能添加一个点。在这种情况下,覆盖
heal
将任何其他金额添加到健康中会违反合同并违反LSP

相反,如果
heal
是一种“为对象的健康状况添加一些点”的方法,那么其他类就不允许对实际添加的量提出任何建议,例如,它们唯一可以依赖的是,调用此方法后的
health
值不小于调用
heal
前的
health
。在这种情况下,您的覆盖不会违反LSP,也不会中断程序