里氏替换原则的理解

一直都搞不明白里氏替换原则的后面两条,到今天才知道原来是自己没有认真思考。闲话不说,记录下来吧以后方便查看。

里氏替换原则的主要作用就是规范继承时子类的一些书写规则。其主要目的就是保持父类方法不被覆盖,试想一下,如果你想覆盖父类的方法,干嘛还要继承他,直接重新写一个类不就完了。

里氏替换原则包含以下4层含义:

  • 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
  • 子类中可以增加自己特有的方法。
  • 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
  • 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

始终记住里氏替换原则的最终目的就可以,就是保持父类的方法不被覆盖。所以前面两层含义和最后一条很容易理解,重点记下我觉得比较难以理解的第三条。

第三条:当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

为了保持 所有引用基类的地方必须能透明地使用其子类的对象。举例子说明:

父类一个方法func(HashMap map);子类方法func(Map map);

父类实例f,子类实例s,为了遵守保持所有引用基类的地方必须能透明地使用其子类的对象这一原则,f.func(HashMap或子类) 必须和s.func(HashMap或子类) 调用的是同一方法,试想如果子类方法func参数范围比父类的窄的话,s.func就会优先调用子类的方法,这样就违背了里氏替换原则的基本定义了。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的问题。以下是一个简单的Java计算器演示系统的示例代码,它符合单一职责原则、里氏替换原则和组合复用原则。 public interface IOperation { public double operate(double a, double b); } public class AddOperation implements IOperation { @Override public double operate(double a, double b) { return a + b; } } public class SubtractOperation implements IOperation { @Override public double operate(double a, double b) { return a - b; } } public class MultiplyOperation implements IOperation { @Override public double operate(double a, double b) { return a * b; } } public class DivideOperation implements IOperation { @Override public double operate(double a, double b) { if (b == 0) { throw new IllegalArgumentException("Cannot divide by 0"); } return a / b; } } public class Calculator { private IOperation operation; public Calculator(IOperation operation) { this.operation = operation; } public double calculate(double a, double b) { return operation.operate(a, b); } } 在这个示例中,我们定义了一个IOperation接口,它代表着所有可执行的操作,例如加法、减法、乘法和除法。我们还创建了几个实现了IOperation接口的类,每个类代表一个具体的操作。每个操作类只能执行一种操作,这符合单一职责原则。 我们还创建了一个Calculator类,它包含一个IOperation实例。Calculator类通过调用其IOperation实例的operate方法来执行相应的操作。由于我们使用接口注入Calculator类的操作,这符合里氏替换原则,并且我们还避免了硬编码操作。 最后,我们将操作实例注入Calculator的构造函数中,这符合组合复用原则,因为我们将可复用的操作功能封装在一个单独的类中,并将其注入到需要它的地方。 希望这个例子能够帮助您理解如何使用单一职责原则、里氏替换原则和组合复用原则编写更好的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值