欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

P3:里氏替换原则(LSP)

程序员文章站 2024-01-14 13:59:16
...

里氏替换原则(Liskov Substitution Principle),简称LSP.

一、定义:

美国计算机科学Barbara Liskov提出定义如下:

如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1代换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。

引用基类(父类的)地方都可以用子类来替换,但是反过来就不行。比如,香蕉是水果,但是水果不一定是香蕉。由于基类可以使用子类类替换,因此在程序中尽量使用基类来定义对象,在运行时指向其子类。
里氏替换原则属于开闭原则的规范之一。

二、使用约束:

1、子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法;
2、子类中可以添加特有方法(父类中不存在),此时则无法在以父类定义的对象中使用该方法,除非在使用的时候强转基类成子类进行调用;
3、当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松;
4、当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

在设计的时候,尽量将父类设计为抽象类或者接口,让子类继承父类或者实现父类中定义好的接口方法,子类实例在运行时替换父类实例。扩展新功能的时候,无需修改原有的子类代码。

三、学习案例:

// 抽象基类
public abstract class Fruits{
}
public class Banana extends Fruits{
}
public class Apple extends Fruits{
}
// 在水果商店中,设置水果的价格,只需要传入水果基类即可。
//这种方式方便扩展新的水果种类,而无须改变接口定义;
public class FruitShop{
    void resetPrice (Fruits fruits){
    }
}

里氏替换原则是实现开闭原则的重要规范之一,大家在开发过程多体会其中的妙处。

END.