加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

里氏代换原则

发布时间:2020-12-14 05:19:39 所属栏目:百科 来源:网络整理
导读:严格表达: 如果对每一个类型为T1的对象o1,都有类型T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型(换而言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根

严格表达:

如果对每一个类型为T1的对象o1,都有类型T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型(换而言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能觉察出基类对象和子类对象的区别)。

里氏代换原则是继承复用的基石,只有当衍生类可以替换基类,软件功能不会受到影响,基类才能真正被复用,而衍生类才能够在基类的基础上添加新的行为。它告诉我们,在软件中,可以将一个基类对象替换为它的一个子类对象。反之如果把子类对象替换为父类对象的话不一定成立,因为如果使用子类的自己行为而不是从父类复用的行为,那么它是没有。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

注意问题:

1.子类的所有方法必须在父类中声明或子类必须实现父类中声明的所有方法。根据理是代换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存在子类中,在父类中部提供相应的声明,则无法中以父类定义的对象中使用该方法。

2.运用该原则时,尽量把父类设计为抽象类或接口,让子类继承父类或者实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,这样很方便的扩展系统的功能,同时无需修改原有子类的代码,新的功能可以通过添加新的子类来实现。里氏代换原则是实现开闭原则的具体手段之一。

3.java语言里对里氏代换提供了支持。在编译时期,java语言编译器会检查一个程序是否符合里氏代换,这是一个无关实现的,纯语言意义的检查。如果该程序使用破坏了里氏代换使用原则,编译器就会给出编译时期错误。但这种检查是有局限系的,java编译器不能检查一个系统在实现和商业逻辑上是否里氏代换原则。

代码重构:


里氏代换原则讲的是基类和子类的关系。只有当这种关系存在时,里氏代换关系才存在,否则关系就不存在。那么当遇到破坏里氏代换原则的两个类A,B时,那么我们可以采用两种重构方案:1.创建一个新的抽象类C,作为两个具体类的超类,将A,B的共同行为放到C中,从而解决AB行为不一致的问题。2.从B到A的继承关系改为委派关系,这样B类也可以调用A的行为。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读