• 七大原则四-->里氏替换原则


    里氏替换原则

    解决类继承(对象)代码耦合性问题

    继承关系中 父类修改 会影响子类

    基本介绍
    1) 里氏替换原则(Liskov Substitution Principle)在1988年,由麻省理工学院的以为姓里
    的女士提出的。
    2) 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序
    P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1
    的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。
    3) 在使用继承时,遵循里氏替换原则,在子类中 尽量不要重写父类的方法
    4) 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了, 在适当的情况下,可
    以通过聚合,组合,依赖

    以下代码 违背了里氏替换原则

    package com.wf.zhang.Liskov;
    
    public class Liskov {
    
        public static void main(String[] args) {
    
            A a = new A();
            System.out.println("11-3=" + a.func1(11, 3));
            System.out.println("1-8=" + a.func1(1, 8));
            System.out.println("-----------------------");
            B b = new B();
            /***
             * B类 继承 A类  并重写了func1  违背了里氏替换原则
             * B类中的func1方法 和 A类 func1方法 不一样了
             * 代码结果就出问题了
             */
            System.out.println("11-3=" + b.func1(11, 3));
            System.out.println("1-8=" + b.func1(1, 8));
            System.out.println("11+3+9=" + b.func2(11, 3));
        }
    }
    
    class A {
        public int func1(int num1, int num2) {
            return num1 - num2;
        }
    }
    
    class B extends A {
        public int func1(int a, int b) {
            return a + b;
        }
    
        public int func2(int a, int b) {
            return func1(a, b) + 9;
        }
    }

    错误的结果

     解决  里氏替换原则告诉我们,继承实际上让两个类耦合性增强了, 在适当的情况下,可
    以通过聚合,组合,依赖

     具体实现  原来父类 子类 都继承一个基类  去掉原来继承关系   采用组合的关系替代

    package com.wf.zhang.Liskov.improve;
    
    public class Liskov {
    
        public static void main(String[] args) {
    
            A a = new A();
            System.out.println("11-3=" + a.func1(11, 3));
            System.out.println("1-8=" + a.func1(1, 8));
            System.out.println("-----------------------");
            B b = new B();
            /***
             *    A类   B类 (没有继承关系) 
             * B类中的func1方法  就是 重写的两数之和
             */
            System.out.println("11+3=" + b.func1(11, 3));
            System.out.println("1+8=" + b.func1(1, 8));
            System.out.println("11+3+9=" + b.func2(11, 3));
            
            /**
             * 在B中组合A(组合关系)
             * 仍然需要使用A的方法  求得两数之差
             * 调用func3
             */
            System.out.println("11-3=" + b.func3(11, 3));
        }
    }
    /**
     * 建立基类   A类   B类 (没有继承关系)  都继承 基类
     *
     */
    class Base{
        
    }
    
    
    class A extends Base{
        public int func1(int num1, int num2) {
            return num1 - num2;
        }
    }
    
    class B extends Base {
        //需要使用A的方法  在B中组合A(组合关系)
        private A a = new A();
        
        public int func1(int a, int b) {
            return a + b;
        }
    
        public int func2(int a, int b) {
            return func1(a, b) + 9;
        }
        //新建func3  使用A的方法
        public int func3(int a, int b) {
            return this.a.func1(a, b);
        }
    }

    正确结果

    古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。
  • 相关阅读:
    Java上传图片
    git下拉项目失败,报错 RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
    关于Java项目启动后浏览器访问本机磁盘里的图片报错Not allowed to load local resource
    window安装Redis和springboot整合Redis进行简单使用
    Java强弱密码校验,必须包含大小写字母、数字、特殊符号
    工作记录:C# ashx生成验证码图片及校验
    springboot配置逆向工程
    mysql学习总结(二)
    ISM模型:用python实现可达矩阵求解和层级划分
    mysql学习总结(一)
  • 原文地址:https://www.cnblogs.com/wf-zhang/p/12307646.html
Copyright © 2020-2023  润新知