首页 > 其他分享 >软件设计原则—里氏代换原则

软件设计原则—里氏代换原则

时间:2024-05-19 16:57:17浏览次数:23  
标签:原则 软件设计 代换 void width length double 父类 public

里氏代换原则是面向对象设计的基本原则之一。

里氏代换原则:任何基类可以出现的地方,子类一定可以出现。通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

如果通过重写父类的方法来完成新的功能,这样写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大。

下面看一个里氏替换原则中经典的一个例子:正方形不是长方形。

在数学领域里,正方形毫无疑问是长方形,它是一个长宽相等的长方形。所以,我们开发的一个与几何图形相关的软件系统,就可以顺理成章的让正方形继承自长方形。

image

长方形类Rectangle

package com.lmcode.principles.Richtersubstitutionprinciple;

// 长方形类
public class Rectangle {
    private double length;
    private double width;

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

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

正方形类Square

package com.lmcode.principles.Richtersubstitutionprinciple;

// 正方形类
public class Square extends Rectangle {

    @Override
    public void setLength(double length) {
        super.setLength(length);
        super.setWidth(length);
    }

    @Override
    public void setWidth(double width) {
        super.setLength(width);
        super.setWidth(width);
    }
}

测试方法main

package com.lmcode.principles.Richtersubstitutionprinciple;

public class RectangleDemo {
    // 拓宽
    public static void resize(Rectangle rectangle) {
        // 如果宽比长小,拓宽+1
        while (rectangle.getWidth() <= rectangle.getLength()) {
            rectangle.setWidth(rectangle.getWidth() + 1);
        }
        // 宽比长大,退出
    }

    //打印长方形的长和宽
    public static void printLengthAndWidth(Rectangle rectangle) {
        System.out.println(rectangle.getLength());
        System.out.println(rectangle.getWidth());
    }

    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.setLength(20);
        rectangle.setWidth(10);
        resize(rectangle);
        printLengthAndWidth(rectangle);

        System.out.println("============");

        Rectangle rectangle1 = new Square();
        rectangle1.setLength(10);
        resize(rectangle1);
        printLengthAndWidth(rectangle1);
    }
}

标签:原则,软件设计,代换,void,width,length,double,父类,public
From: https://www.cnblogs.com/lm02/p/18200485

相关文章

  • 软件设计原则—开闭原则
    在程序需要进行拓展的时候,不能去修改原有的代码,而是实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生......
  • 软件设计师(中级) 笔记
    软件设计师「学习路线」(推荐该顺序学习,按照先易后难排序)1、上午题—计算机系统(5~6分)1.cpu:cpu是硬件系统的核心功能:控制器(程序控制,操作控制)运算器(时间处理,数据处理)运算器:算术逻辑单元(ALU):实现算术运算和逻辑运算......
  • 设计原则
    单一功能原则:它规定一个类应该只有一个发生变化的原因,即一个类/方法只干一件事。开闭原则:对于扩展是开放的,但是对于修改是封闭的,这意味着在不修改一个软件实体的基础上去扩展其功能。依赖倒置原则:要底层实现尽量依赖抽象类与接口,方便系统间的解耦,有利于扩展与维护。合成复用原......
  • 项目管理十二原则
    价值驱动的项目管理知识体系第七版是新的基于价值的一个项目管理体系。包括了基于过程的项目管理,也包括了这个基于价值的新的项目管理体系。十二原则就是项目经理看待项目管理的十二个角度,十二个底线项目管理原则国家原则就是绝对不能突破的。什么是原则?原则属于价......
  • 不可变(immutable)设计原则
    我们先从Java的数据类型与类型检查说起数据类型数据类型是什么?数据类型是一组值以及可以对其执行的操作,比如:-boolean:Truthvalue(trueorfalse)-int:Integer(0,1,-47)-double:Realnumber(3.14,1.0,-2.1)-String:Text("Hello","example")而变量就是用特......
  • 软件设计师基础学习 十三
    十三、结构化开发方法13.1*系统分析与概述1,认识、理解当前的环境,获得当前系统的“物理模型”2.从当前系统的“物理模型”抽象出当前系统的“逻辑模型”3.对当前系统的“逻辑模型”进行分析和优化,建立目标系统的“逻辑模型”4.对目标系统的逻辑模型具体化(物理化),建立目标系......
  • 软件设计师基础学习 十四
    十四、面向对象技术14.1面向对象开发概念:对象:由数据及其操作所构成的封装体,是系统中用来描述客观事务的一个实体,是构成系统的一个基本单位。一个对象通常可以由对象名、属性和方法3个部分组成类:现实世界中实体的形式化描述,类将该实体的属性(数据)和操作(函数)封装在一起......
  • [实验感悟] 系列(1) 野外实验要遵循的几个原则
    关键词:野外实验、学生、遥感实验、种苗表型作者:ludwig1860日期:2024.5.15印象中有2年多没有亲自带学生野外实验了,甚至之前从来没有带学生进行过一次完整地、系统地、历经实验设计-方案制定-仪器准备-方法学习-细致考虑-野外实践-数据整理-数据处理整套流程的实验......
  • 软件设计模式概念篇
    创建型模式1、创建型模式(CreationalPattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。2、为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。3、创建型......
  • 软件设计师基础学习 十二
    十二、项目管理12.1范围管理范围管理确定在项目内包括什么工作和不包括什么工作,由此界定的项目范围在项目的全生命周期内可能因种种原因而变化,项目管理范围也要管理项目范围的这种变化。项目范围的变化也叫变更对项目范围的管理,是通过5个管理过程来实现的:规划范围管理(编制......