【问题标题】:Java LSP "derived object can substitute base object"Java LSP“派生对象可以替代基础对象”
【发布时间】:2016-01-10 12:43:04
【问题描述】:

关于 Liskov 替换原则 (LSP),它指出派生类的对象可以替换它的基类对象,而不会导致程序无法执行。

如果我的父类是一个带有函数的抽象基类:

public abstract class BaseClass {
    public void heal() {
        health++;
    }
}

我可以在派生类中覆盖治疗方法吗?它对 LSP 原则仍然有效,例如:

public class ChildClass extends BaseClass {
   @Override public void heal() {
   super.heal();
   super.heal();
}

程序仍将执行,我可以将 ChildClass-Objects 传递给需要 BaseClass-Object 作为参数的方法。然而,这两种heal() 方法的行为略有不同。

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

【问题讨论】:

    标签: oop liskov-substitution-principle


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多