首页 > 编程语言 >面向对象编程的 SOLID 原则 - 里氏替换原则

面向对象编程的 SOLID 原则 - 里氏替换原则

时间:2023-07-29 16:56:39浏览次数:35  
标签:原则 SOLID public height width int 面向对象编程 class Rectangle

里氏替换原则

里氏替换原则描述的是子类应该能替换为它的基类。

意思是,给定 class B 是 class A 的子类,在预期传入 class A 的对象的任何方法传入 class B 的对象,方法都不应该有异常。

这是一个预期的行为,因为继承假定子类继承了父类的一切。子类可以扩展行为但不会收窄。

因此,当 class 违背这一原则时,会导致一些难于发现的讨厌的 bug。

里氏替换原则容易理解但是很难在代码里发现。看一个例子:


class Rectangle {
	protected int width, height;

	public Rectangle() {
	}

	public Rectangle(int width, int height) {
		this.width = width;
		this.height = height;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public int getArea() {
		return width * height;
	}
}

有一个简单的 Rectangle class,以及一个 getArea 方法返回矩形的面积。

现在准备创建另一个 Squares class。众所周知,正方形只不过是宽和高相等的特殊的矩形。


class Square extends Rectangle {
	public Square() {}

	public Square(int size) {
		width = height = size;
	}

	@Override
	public void setWidth(int width) {
		super.setWidth(width);
		super.setHeight(width);
	}

	@Override
	public void setHeight(int height) {
		super.setHeight(height);
		super.setWidth(height);
	}
}

我们的 Square class 继承自 Rectangle class。在构造器里设置宽和高相等,我们不希望任何客户端(在他们的代码里使用我们的 class)违背了正方形的特性将宽高改成不相等。

因此我们重载了 setter 使宽和高任何一个改变时都会同时改变宽高。这样一来,我们就违背了里氏替换原则。

让我们先编写一个 test 来测试 getArea 函数。


class Test {

   static void getAreaTest(Rectangle r) {
      int width = r.getWidth();
      r.setHeight(10);
      System.out.println("Expected area of " + (width * 10) + ", got " + r.getArea());
   }

   public static void main(String[] args) {
      Rectangle rc = new Rectangle(2, 3);
      getAreaTest(rc);

      Rectangle sq = new Square();
      sq.setWidth(5);
      getAreaTest(sq);
   }
}

团队的测试人员提出测试函数 getAreaTest ,然后告诉你正方形对象的 getArea 函数不能通过测试。

在第一个测试中,我们创建了一个宽为 2 高为 3 的矩形,然后调用 getAreaTest,预期输出为 20,但是当传入一个正方形时出错了。这是因为调用测试里的 setHeight 函数会同时设置 width,导致输出结果不符预期。

标签:原则,SOLID,public,height,width,int,面向对象编程,class,Rectangle
From: https://www.cnblogs.com/gongxianjin/p/17590070.html

相关文章

  • 面向对象编程的 SOLID 原则 - 依赖倒置原则
    依赖倒置原则依赖倒置原则描述的是我们的class应该依赖接口和抽象类而不是具体的类和函数。在这篇文章(2000)里,Bob大叔如下总结该原则:“如果OCP声明了OO体系结构的目标,那么DIP则声明了主要机制”。这两个原则的确息息相关,我们在讨论开闭原则之前也要用到这一模式。......
  • 面向对象编程的 SOLID 原则 - 接口隔离原则
    接口隔离原则隔离意味着保持独立,接口隔离原则是关于接口的独立。该原则描述了很多客户端特定的接口优于一个多用途接口。客户端不应该强制实现他们不需要的函数。这是一个简单的原则,很好理解和实践,直接看例子。publicinterfaceParkingLot{ voidparkCar(); //Decrease......
  • 面向对象编程的 SOLID 原则
    SOLID原则是面向对象class设计的五条原则。他们是设计class结构时应该遵守的准则和最佳实践。通常,这五个原则可以帮助我们了解设计模式和软件架构。这是每个开发人员都应该了解的主题。这篇文章介绍了在项目中使用SOLID原则的细节。首先我们先看一下SOLID原则的历史。......
  • Python面向对象编程-学习笔记(二)
    5.类的继承classEmployee:raise_amount=1.04def__init__(self,first,last,pay):self.first=firstself.last=lastself.pay=payself.email=first+'.'+last+'@company.com'cla......
  • 面向对象编程的 SOLID 原则 - 开闭原则
    开闭原则开闭原则要求“class应该对扩展开放对修改关闭”。修改意味着修改存在class的代码,扩展意味着添加新的功能。这个原则想要表达的是:我们应该能在不动class已经存在代码的前提下添加新的功能。这是因为当我们修改存在的代码时,我们就面临着创建潜在bug的风险。因此,......
  • 定制化SOLIDWORKS插件开发服务流程解析
    SOLIDWORKS是一套三维设计软件,采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式,可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改,而不需要编程。SOLIDWORKS软件本身的方程式可以实现简单的参数逻辑变......
  • terrasolid是什么?和microstation v8i的关系?
    Terrasolid这款软件需要在MicroStationV8i这个软件的运行环境下才能使用。参考:https://www.cnblogs.com/yibeimingyue/p/15589355.html参考2:https://wenku.baidu.com/view/4f5aa22e660e52ea551810a6f524ccbff121ca1b.html参考3:https://download.csdn.net/download/hhudxy2010/......
  • 响应式网页设计应该注意的9个原则
    响应式网站越来越受到大家的欢迎,有利也有弊的因素。它没有固定的页面尺寸、没有毫米或英寸,没有任何物理限制,让人感到无从下手。下面就和大家分析如何运用响应式web设计的各项基本原则来实现。为了简单起见,就说说响应式网站的布局。希望对你有所受益。1、Web字体Vs系统字体想让自......
  • solidworks api ch04
    用默认模板新建零件,并修改用户偏爱:letnewPart(swApp:ISldWorks)=//GetthefilepathofthedefaultparttemplateletpartTemplate=swApp.GetUserPreferenceStringValue(intswUserPreferenceStringValue_e.swDefaultTemplatePart)letswModel=......
  • SOLIDWORKS PDM中如何快速生成BOM,SolidKits助您一臂之力
    在SOLIDWORKSPDM中,生成BOM操作是比较简单的,但前提条件是我们的模型必须具有相应的属性信息才可以。SolidKits.Reports企业高级报表软件给用户提供了一种更加便捷的出BOM的方式,使我们的工作效率更高,其使用方法也非常简单,我们一起来看下操作步骤吧!首先找到需要生成BOM的总成文件,然......