码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-02-14 16:57:02      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:通过   ima   bsp   错误   zhang   两数之和   增强   oid   mic   

里氏替换原则

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

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

基本介绍
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);
    }
}

正确结果

技术图片

 

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

标签:通过   ima   bsp   错误   zhang   两数之和   增强   oid   mic   

原文地址:https://www.cnblogs.com/wf-zhang/p/12307646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!