Java LSP"派生对象可以替换基础对象"

时间:2016-01-10 12:43:05

标签: oop liskov-substitution-principle

关于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的情况下覆盖子类中抽象基类的具体方法吗?

1 个答案:

答案 0 :(得分:3)

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

如果您的heal方法记录为“向对象的健康状况添加一个点”,那么使用您的BaseClass的其他类依赖于仅添加一个点。在这种情况下,覆盖heal以向健康添加任何其他金额会破坏合同并违反LSP。

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