1、 (违反里氏替换原则的反例子 )现需要完成一个两数相减的功能,由类Subtraction来负责;需要增加一个新的功能:完成两数相加,然后再与 10求和,由类 Add来负责,所以类 Add继承类 S

文章通过两个例子讨论了编程中的设计问题。第一个例子说明了Add类违反里氏替换原则,直接调用Subtraction类的方法导致错误结果。第二个例子涉及正方形继承长方形,指出这种设计可能导致不必要的复杂性和错误,因为正方形的特性不同于长方形。这两个例子都强调了正确继承和类设计的重要性。
摘要由CSDN通过智能技术生成

1、 (违反里氏替换原则的反例子 )现需要完成一个两数相减的功能,由类Subtraction来负责;需要增加一个新的功能:完成两数相加,然后再与 10求和,由类 Add来负责,所以类 Add继承类 Subtraction后。调试运行此示例,分析程序运行得到错误结果的原因。

在这个例子中,Add类继承了Subtraction类,但是它的新增功能addAndSumTo10并没有对原有函数进行扩展或重载,而是直接调用了Subtraction类中的函数,破坏了原有类的封装性和稳定性。这样的设计不仅违反了里氏替换原则,而且可能导致程序出现错误结果,因为在调用addAndSumTo10函数时,实际上是调用了Subtraction类中的subtract函数,并将其结果加上了10,而不是两数相加再加10。因此,需要对Add类进行重新设计,或者将新增功能实现为一个新的独立函数,而不是直接调用原有函数。

2、分析程序:正方形不少长方形。在数学领域里,正方形毫无疑问是长方形,它是一个长宽相等的长方形。所以,我们开发的一个与几何图形相关的软件系统中,让正方形继承自长方形是顺利成章的事情。现在,我们截取该系统的一个代码片段进行分析://长方形类 Rectangle:class Rectangle { double length; double width; public double getLength() { return length; } public void setLength(double height) { this.length = length; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } }//正方形类 Square:class Square extends Rectangle { public void setWidth(double width) {
super.setLength(width); super.setWidth(width); } public void setLength(double length) { super.setLength(length); super.setWidth(length); } }由于正方形的度和宽度必须相等,所以在方法 setLength和 setWidth中,对长度和宽度赋值相同。类 TestRectangle是我们的软件系统中的一个组件,它有一个 resize方法要用到基类 Rectangle,resize方法的功能是模拟长方形宽度逐步增长的效果://测试类 TestRectangle:class TestRectangle { public void resize(Rectangle objRect) { while(objRect.getWidth() <= objRect.getLength()) { objRect.setWidth( objRect.getWidth () + 1 ); } }}分析程序的执行结果

程序的执行结果是将长方形的宽度逐步增加,直到宽度大于长度为止。这是因为在resize方法中,每次将长方形的宽度加1,直到宽度大于长度为止。由于正方形继承了长方形,所以正方形也可以使用resize方法来模拟宽度的增长,但是由于正方形的宽度和长度相等,所以在正方形的setWidth和setLength方法中,只需要调用基类Rectangle的setWidth和setLength方法,并将宽度和长度设置为相同的值即可。

1、违反里氏替换原则的反例子:

class Subtraction {
public int subtract(int a, int b) {
return a - b;
}
}

class Add extends Subtraction {
public int addAndSumTo10(int a, int b) {
return super.subtract(a, b) + 10;
}
}

在这个例子中,Add类继承了Subtraction类,但是其新增的功能addAndSumTo10并没有符合里氏替换原则,因为它并没有对原有函数进行扩展或重载,而是直接调用了Subtraction类中的函数,破坏了原有类的封装性和稳定性。

2、正方形不少长方形:

这个例子虽然看起来符合“正方形是长方形”的逻辑,但是在程序实现上出现了问题。因为长方形和正方形在尺寸和特性上有所不同,所以在代码中直接让正方形继承长方形会导致难以维护和扩展的代码。在这个例子中,如果想要对正方形类进行修改或扩展,可能会影响到长方形的使用,产生不必要的风险。因此,更好的做法是将正方形和长方形视为两个独立的类,各自实现对应的特性和方法,避免继承带来的复杂性和不确定性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值