首页 > 其他分享 >里氏替换原则

里氏替换原则

时间:2023-08-28 23:23:07浏览次数:38  
标签:fun1 原则 int 里氏 System public println 替换 out

里氏替换原则

OOP(Object Oriented Programming) 面向对象编程

OO中的继承性的思考
  • 1.继承包含这样一层含义,父类中凡是已经写好的方法,实际上就是设定规范。虽然不强制要求所有子类必须遵守规范(不重写方法),但是如果子类对这些方法,任意修改就会对继承体系造成破坏。
  • 2.继承在程序设计带来便利同时,也带来弊端。使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合,如果一个类被其他类继承,则当这个类需要修改时,必须考虑所有的子类,并且父类修改后,所有涉及到的子类的功能可能会受到影响。
  • 3.问题提出,编码中如何正确的使用继承? => 里氏替换原则
基本介绍
  • 1.里氏替换原则(Liskov Substitution Principle)在1988年,由麻省理工学院的里姓女士提出的。
  • 2.如果对每个类T1对象t1,都有类型T2的对象t2,使得以T1定义的所有对象t1替换为t2时,程序的行为不会方式改变,那么T2类是T1的子类。换句话说,所有引用基类的地方,必须能透明的使用其子类的对象。
  • 3.在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类中写好的方法。
  • 4.里氏替换原则,说明继承让两个类的耦合性增强了,在合适的情况下,可以使用组合,聚合,依赖传递解决问题。
案例1

案例只是为了体现原则的设计,并无实际意义

/**
 * @author 长名06
 * @version 1.0
 * 里氏替换原则 案例1
 * 分析
 *  因为B类继承了A类,且不小心,重写了A类的fun1方法,导致
 *  原有的父类的方法的功能,被破坏,违反了里氏替换原则
 *  所以,在需要重写父类的方法的类关系中,可以将继承关系替换成依赖(组合,聚合)关系
 */
public class Liskov1 {
    public static void main(String[] args) {
        A a = new A();
        System.out.println("2-4=" + a.fun1(2, 4));
        System.out.println("5-4=" + a.fun1(5, 4));

        B b = new B();
        System.out.println("2-4=" + b.fun1(2,4));//要求出2-4
        System.out.println("4-5=" + b.fun1(4,5));//要求出4-5
        System.out.println("4-5 + 9=" + b.fun2(4,5));//要求出4-5 + 9
    }
}

class A {
    public int fun1(int a, int b) {
        return a - b;
    }
}

class B extends A {
    @Override
    public int fun1(int a, int b) {
        return a + b;
    }

    public int fun2(int a, int b) {
        return fun1(a, b) + 9;
    }
}
案例2
/**
 * @author 长名06
 * @version 1.0
 * 使用组合方式 替代继承方式
 */
public class Liskov2 {
    public static void main(String[] args) {
        A a = new A();
        System.out.println("2-4=" + a.fun1(2, 4));
        System.out.println("5-4=" + a.fun1(5, 4));

        B b = new B();
        System.out.println("2-4=" + b.fun3(2,4));
        System.out.println("4-5=" + b.fun3(4,5));
        System.out.println("4+ 5 + 9=" + b.fun2(4,5));
    }
}

class Base{

}

class A extends Base {
    public int fun1(int a, int b) {
        return a - b;
    }
}

class B extends Base {

    private A base = new A();

    public int fun1(int a, int b) {
        return a + b;
    }

    public int fun2(int a, int b) {
        return fun1(a, b) + 9;
    }

    public int fun3(int a,int b){
        return base.fun1(a,b);
    }
}

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:fun1,原则,int,里氏,System,public,println,替换,out
From: https://www.cnblogs.com/changming06/p/17663649.html

相关文章

  • Spring3中替换默认拦截器的方法BeanFactoryPostProcessor
    由于Spring默认的静态资源处理器不能满足需求,需要做一些自己的处理,但mvc:resources的标签又挺好用的,不想每次配置静态资源目录的时候,还要特殊指定处理器,也不想修改任何配置代码,于是找到了使用BeanFactoryPostProcessor的方法 实现代码如下:importorg.springframework.beans.Beans......
  • 依赖倒转原则详解
    依赖倒转原则基本介绍依赖倒转原则(DependenceInversionPrinciple):1.高层模块,不要依赖底层模块,二者都应该依赖其抽象。2.抽象不应该依赖细节,细节应该依赖抽象。3.依赖倒转的核心思想是面向接口编程。4.依赖倒转原则基于这样的设计理念:相对于细节的多变,抽象的东西就稳定......
  • 设计模式学习笔记——接口隔离原则
    定义:1、客户端不应该依赖于它不需要的接口2、类间的依赖关系应该建立在最小的接口上通俗的讲,应该建立单一的接口,不要建立臃肿庞大的接口,即接口应该尽量细化,同时接口中的方法尽量少。举例:要成为一名美女必须具备三个条件:面貌、身材、气质,星探找美女的过程如下类图所示:IPrettyGirl接......
  • Java字符串替换
    JavaStringreplaceAll详解总结:Java编译期\为转义符,运行期正则表达式\为转义符,正则表达式匹配\需使用\\。replace为普通字符串替换,replaceAll为正则表达式替换(第一个参数为正则表达式,第二个参数中\为转义字符,$为正则字符),第二个参数表示\需使用\\。示例:替换字符串中的""......
  • linux系统批量查找网站源码并替换字符,查找替换指定内容
    问题描述:维护中需要批量修改代码中某个字符,如果单个打开页面进行修改则效率过低,linux系统下借助grep命令快速查找替换 命令示例1:grep-rl'查找的内容'.|xargssed-i's/查找的内容/替换的新内容/g'登录服务器后,根据实际情况输入需要查找/替换的内容即可,以上命令表示当......
  • 替换VMware虚拟化有什么选择?
    随着国内信创转型的落地发展,越来越多用户开始聚焦各个IT层级发力,“VMware替换”是其中之一,且已出现各行业领域用户从VMware迁移转型的实际案例。与此同时,用户对架构转型的需求仍旧十分强烈,在从传统架构到分布式架构的转型中,如果能同时实现VMware虚拟化的替换,自然是一举两得......
  • mysql字符串替换 replace方法替换字段中的值
    需求:字符串A是一个JSON字符串,其中的属性值可能为空吗,例如字段”result“{"处理结果":{"字段A":{"结果":""},......,{"字段X":{"结果”:""}}}需求:如果其中的结果为空则将 {"结果":""}替换为""selectreplace(result,'{"......
  • 接口隔离原则
    接口隔离原则介绍客户端不要依赖不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。案例引入A类,通过接口1依赖B类,C类通过依赖接口1依赖D类,A类只会用到1-3方法,C类只会使用到1,4,5方法。uml类图代码实现publicclassSegregation1{publicstaticvoidmain(......
  • 面向对象设计原则
    前言在面向对象的软件设计中,只有尽量降低各个模块之间的耦合度,才能提高代码的复用率,系统的可维护性、可扩展性才能提高。面向对象的软件设计中,有23种经典的设计模式,是一套前人代码设计经验的总结,如果把设计模式比作武功招式,那么设计原则就好比是内功心法。常用的设计原则有七个......
  • SOLIDWORKS工程图模板怎样批量替换 利用SolidKits软件轻松解决
    三维模型设计完成之后,还有一项比较繁琐的工作,就是出工程图。我们知道使用SOLIDWORKS出工程图时是要先选择模板的,模板里面就定义好了标准、尺寸样式、精度、标题栏等信息,标题栏里面的信息在模型导入之后,就会自动填写,也是比较方便的。但随着产品的更新迭代,很有可能工程图的模板也会......