×

里氏替换原则

里氏替换原则是否适用于抽象类和接口,为什么?里氏替换原则与依赖倒置原则有什么区别

admin admin 发表于2022-05-24 13:23:57 浏览143 评论0

抢沙发发表评论

里氏替换原则是否适用于抽象类和接口,为什么


LSP:里氏替换原则

* 原则上来讲,子类对象可以赋给父类对象,也可以说子类替换父类,并且出现在父类能过出现的任何地方
*
* 反过来说,父类对象时不能替换子类对象的,这种特性称为里氏替换原则
* 1.子类可以隐士的转换为父类对象
* 2.父类必须强转子类

里氏替换原则与依赖倒置原则有什么区别


区别:

  1. 定义不同:里氏替换原则是关于子类与父类的原则;依赖倒置原则是关于抽象与细节的原则。

  2. 应用范围不同:依赖倒置原则的应用范围比里氏替换原则更广泛。

  3. 涉及的对象关系不同:里氏替换原则中的子类具有自己的独立性;依赖倒置原则中的细节依赖于抽象。


衍生知识点:

一、里氏替换原则

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

定义2:所有引用基类的地方必须能透明地使用其子类的对象。

通俗来讲:子类可以扩展父类的功能,但不能改变父类原有的功能。是OCP的扩展。它包含以下四层含义:

1. 子类可以实现父类的抽象,但不能覆盖父类的非抽象方法

2. 子类中可以增加自己特有的方法

3. 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入更宽松

4. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类的更严格


二、依赖倒置原则

定义:高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。-里氏替换原则

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B和类C发生联系,则会大大降低修改类A的几率。

核心思想:面向接口编程。含有下面3点:

1. 低层模块尽量都要有抽象类或接口,或者两者都有

2. 变量的声明类型尽量使抽象类或接口

3. 用继承时遵循里氏替换原则


solid原则是什么


solid原则包括以下五个:

1、单一职责原则(SRP):表明一个类有且只有一个职责。一个类就像容器一样,它能添加任意数量的属性、方法等。

2、开放封闭原则(OCP):一个类应该对扩展开放,对修改关闭。这意味一旦创建了一个类并且应用程序的其他部分开始使用它,就不应该修改它。

3、里氏替换原则(LSP):派生的子类应该是可替换基类的,也就是说任何基类可以出现的地方,子类一定可以出现。值得注意的是,当通过继承实现多态行为时,如果派生类没有遵守LSP,可能会让系统引发异常。

4、接口隔离原则(ISP):表明类不应该被迫依赖他们不使用的方法,也就是说一个接口应该拥有尽可能少的行为,它是精简的,也是单一的。

5、依赖倒置原则(DIP):表明高层模块不应该依赖低层模块,相反,他们应该依赖抽象类或者接口。这意味着不应该在高层模块中使用具体的低层模块。

扩展资料:

DIP原则规定了在类之间存在依赖关系的情况下,应使用抽象(如接口)来定义它们,而不是直接引用类。 这减少了由较低级别模块的变化导致的错误,导致较高层的错误。 DIP经常在依赖注入中被使用。

当开发者遵循ISP原则时,大类实现了多个更小的接口,根据用途对功能进行分组。依赖关系与那些相关联用于松耦合,增加健壮性,灵活性以及可复用性。