美文网首页
设计原则(四)里氏替换原则

设计原则(四)里氏替换原则

作者: 六脉神见 | 来源:发表于2018-09-23 22:47 被阅读0次

第一种定义,也是最正宗的定义:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。

第二种定义:Functions that use pointers or references to base classes must be able to useobjects of derived classes without knowing it.
所有引用基类的地方必须能透明地使用其子类的对象。
第二种定义比较通俗,容易理解:只要有父类出现的地方,都可以用子类来替代,而且不会出现任何错误和异常。但是反过来则不行,有子类出现的地方,不能用其父类替代。
举个例子:


image.png

如果所示,Client调用CarService方法给车(Car)加油,代码如下:

public class Car {
    
    private String brand;
    
    private String color;
    
    public Car(String brand, String color){
        this.brand = brand;
        this.color = color;
    }
    
    public String getColor() {
        return color;
    }
    public String getBrand() {
        return brand;
    }
    
}

public class CarService {
    
    public void supply(Car car){
        refuel(car);
    }

    private void refuel(Car car) {
        System.out.println("refueling for "+car.getBrand()+" car ");
        
    }
}

public class ElectricCarService extends CarService {
    
    public void supply(Car car){
        charge(car);
    }

    public void charge(Car car){
        System.out.println("charge for car...");
    }
}

public class Client extends TestCase {

    private List<Car> carList = new ArrayList<Car>();
    
    public void test(){
        Car car = new Car("volkswagan","blue");
        carList.add(car);
        service();
    }
    private void service() {
        CarService supplier = new CarService();
        for (Car car : carList) {
            supplier.supply(car);
        }
        
    }
}

如代码所示,Client调用Service方法给汽车加油。如果这个时候把CarService换成子类ElectricCarService,再调用Service给汽车加油,但是子类没有加油的方法,只有充电的方法,则势必会导致原来父类给汽车加油的行为失败。即子类没办法取代父类,因此违反了里氏替换原则。
解决方法:一般是把补给的行为抽象出来,然后加油和充电作为两个实现类,分别以不同的方式补给。

相关文章

  • 设计模式之里氏替换原则

    设计模式之里氏替换原则 里氏替换原则(LSP: Liskov Substitution Principle) 定义...

  • 里氏替换原则

    个人博客原文:里氏替换原则 设计模式六大原则之二:里氏替换原则。 简介 姓名 :里氏替换原则 英文名 :Lisko...

  • 设计原则(四)里氏替换原则

    第一种定义,也是最正宗的定义:If for each object o1 of type S there is a...

  • 里氏替换原则

    里氏替换原则 “里氏替换原则(Liskov Substitution Principle,LSP)” 定义 一:(...

  • 设计模式的设计原则

    设计模式的设计原则 面向对象五大设计原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 开闭原则 设计模...

  • 01-设计模式原则

    面向对象的设计原则 面向对象的设计原则也被称为SOLID。SOLID原则包括单一职责原则、开闭原则、里氏替换原则、...

  • 六大设计原则

    6大设计原则总结 目录 一、单一职责原则 二、里氏替换原则 三、依赖倒置原则 四、接口隔离原则 五、迪米特法则 六...

  • Swift设计模式----目录

    面向对象设计原则: 开闭原则 单一职责原则 依赖倒置原则 接口分离原则 迪米特法则 里氏替换原则 面向对象设计模式...

  • [设计原则]里氏替换原则

    在面向对象的语言中,继承是必不可少的、非常优秀的语言机制,它有如下优点: 代码共享,减少创建类的工作量,每个子类都...

  • 设计原则——里氏替换原则

    前沿继承:将保持已有类的特性而构造新类的过程称派生:在已有类的基础上新增自己的特性而产生新类的过程称为派生里氏替换...

网友评论

      本文标题:设计原则(四)里氏替换原则

      本文链接:https://www.haomeiwen.com/subject/tfsfoftx.html