澳门威尼斯人网址借使对每三个品类为S的目标o1,那么它肯定可以承受二个BaseClass类型的子类对象sub

里氏代换原则告诉我们,在软件中将三个基类对象替换到它的子类对象,程序将不会发出任何错误和特别,反过来则不树立,倘诺四个软件实体使用的是二个子类对象的话,那么它不肯定能够采取基类对象。诸如:小编欣赏动物,那本身必然喜欢狗,因为狗是动物的子类;可是笔者喜欢狗,无法据此断定作者喜欢动物,因为自己并不希罕老鼠,即使它也是动物。

里氏代换原则由二〇一〇年图灵奖得主、米国先是位处理器科学女博士Barbara
Liskov
任课和Carnegie·梅隆高校姬恩nette
Wing助教于1992年指出。其严刻表述如下:倘若对每二个类型为S的目的o1,都有档次为T的靶子o2,使得以T定义的有着程序P在有着的对象o1代换o2时,程序P的一言一行尚未生成,那么类型S是类型T的子类型。那一个概念比较生硬且难以掌握,由此我们一般拔取它的另3个通俗版定义:

基本概念

在面向对象对象编程中,将1个基类对象替换到它的子类对象,程序将不会发生其余错误和拾壹分,反过来则不树立,假如3个软件实体使用的是3个子类对象的话,那么它不自然可以利用基类对象。

  • 例如:作者喜欢动物,那小编一定喜欢狗,因为狗是动物的子类;但是自身喜欢狗,不大概据此断定作者欣赏动物,因为本身并不欣赏老鼠,即使它也是动物。

  • 譬如说有多个类,2个类为BaseClass,另贰个是SubClass类,并且SubClass类是BaseClass类的子类,那么三个主意如若勉强可以三个BaseClass类型的基类对象base的话,如:method1(base),那么它一定尚可一个BaseClass类型的子类对象sub,method1(sub)可以平常运营。反过来的更换不创制,如一个办法method2收受BaseClass类型的子类对象sub为参数:method2(sub),那么一般而言不可以有method2(base),除非是重载方法。

里氏代换原则是落到实处开闭原则的重大方法之一,由于应用基类对象的地方都足以利用子类对象,因而在程序中尽量接纳基类类型来对目的进行定义,而在运维时再明确其子类类型,用子类对象来替换父类对象。

     
例如有三个类,二个类为BaseClass,另1个是SubClass类,并且SubClass类是BaseClass类的子类,那么1个措施假如得以承受二个BaseClass类型的基类对象base的话,如:method1(base),那么它必然可以承受三个BaseClass类型的子类对象sub,method1(sub)能够健康运营。反过来的转移不成立,如一个主意method2收受BaseClass类型的子类对象sub为参数:method2(sub),那么一般而言不可以有method2(base),除非是重载方法。

里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。

实际采纳

  1. 子类的持有办法必须在父类中声称,或子类必须贯彻父类中宣称的有着办法。依据里氏代换原则,为了保障系统的增加性,在先后中常见接纳父类来展开定义,假使三个方法只存在子类中,在父类中不提供对应的扬言,则不能在以父类定义的靶子中采用该情势。

  2. 我们在行使里氏代换原则时,尽量把父类设计为抽象类或许接口,让子类继承父类或促成父接口,并实未来父类中宣称的情势,运维时,子类实例替换父类实例,大家得以很便利地伸张系统的效用,同时不要修改原有子类的代码,增添新的职能可以通过扩大2个新的子类来兑现。里氏代换原则是开闭原则的求实完结手段之一。

  3. Java语言中,在编译阶段,Java编译器会检查叁个顺序是或不是适合里氏代换原则,那是3个与落到实处非亲非故的、纯语法意义上的自我批评,但Java编译器的检讨是有局限的。

     
里氏代换原则是贯彻开闭原则的重点措施之一,由于采取基类对象的地方都得以采用子类对象,由此在程序中尽量采用基类类型来对目标开展定义,而在运营时再分明其子类类型,用子类对象来替换父类对象

     
里氏代换原则告诉大家,在软件中校二个基类对象替换来它的子类对象,程序将不会生出其它不当和丰裕,反过来则不创造,如若多少个软件实体使用的是三个子类对象的话,那么它不自然可以使用基类对象。譬如:小编爱好动物,那作者决然喜欢狗,因为狗是动物的子类;可是自身喜欢狗,不或者据此断定作者爱不释手动物,因为自身并不喜欢老鼠,就算它也是动物。

      在运用里氏代换原则时需求留意如下多少个难点:

     
例如有三个类,三个类为BaseClass,另一个是SubClass类,并且SubClass类是BaseClass类的子类,那么三个办法如若还是可以三个BaseClass类型的基类对象base的话,如:method1(base),那么它必然基本上能用一个BaseClass类型的子类对象sub,method1(sub)可以健康运作。反过来的转换不创制,如三个办法method2经受BaseClass类型的子类对象sub为参数:method2(sub),那么一般而言不得以有method2(base),除非是重载方法。

     
(1)子类的全数办法必须在父类中宣称,或子类必须达成父类中宣示的享有办法。依照里氏代换原则,为了有限帮助系统的扩大性,在程序中国和扶桑常采纳父类来进展定义,设若多个方法只存在子类中,在父类中不提供对应的扬言,则无从在以父类定义的靶子中动用该情势

     
里氏代换原则是兑现开闭原则的根本情势之一,由于选用基类对象的地点都足以运用子类对象,因此在先后中尽量使用基类类型来对目标进行定义,而在运维时再显然其子类类型,用子类对象来替换父类对象

      (2)
 大家在行使里氏代换原则时,尽量把父类设计为抽象类或然接口,让子类继承父类或促成父接口,并完结在父类中表明的不二法门,运转时,子类实例替换父类实例,大家可以很便利地壮大系统的机能,同时不要修改原有子类的代码,扩张新的效率可以经过增添二个新的子类来促成。里氏代换原则是开闭原则的求实贯彻手段之一。

      在采纳里氏代换原则时索要专注如下多少个难点:

     
(3) Java言语中,在编译阶段,Java编译器会检讨三个程序是不是适合里氏代换原则,那是二个与已毕无关的、纯语法意义上的自作者批评,但Java编译器的自小编批评是有局限的。

     
(1)子类的保有办法必须在父类中声称,或子类必须完成父类中宣称的具有办法。依照里氏代换原则,为了保险系统的增加性,在先后中常见采纳父类来拓展定义,要是3个方法只设有子类中,在父类中不提供对应的表明,则不能在以父类定义的对象中行使该办法。

      在Sunny软件公司开发的CRM系统中,客户(Customer)可以分为VIP客户(VIPCustomer)和普通客户(CommonCustomer)两类,系统需要提供一个发送Email的功能,原始设计方案如图1所示:

图1原始结构图

      在对系统进行进一步分析后发现,无论是普通客户还是VIP客户,发送邮件的过程都是相同的,也就是说两个send()方法中的代码重复,而且在本系统中还将增加新类型的客户。为了让系统具有更好的扩展性,同时减少代码重复,使用里氏代换原则对其进行重构。

      (2)
 大家在运用里氏代换原则时,尽量把父类设计为抽象类恐怕接口,让子类继承父类或落成父接口,并促成在父类中宣示的措施,运维时,子类实例替换父类实例,我们得以很方便地增加系统的功效,同时不要修改原有子类的代码,增添新的效应可以因而扩大一个新的子类来贯彻。里氏代换原则是开闭原则的现实贯彻手段之一。

     
在本实例中,能够考虑增添二个新的悬空客户类Customer,而将CommonCustomer和VIPCustomer类作为其子类,邮件发送类EmailSender类针对抽象客户类Customer编程,依照里氏代换原则,可以承受基类对象的地方一定能够经受子类对象,因而将EmailSender中的send()方法的参数类型改为Customer,若是急需充实新类型的客户,只需将其看作Customer类的子类即可。重构后的构造如图2所示:

      (3)
Java语言中,在编译阶段,Java编译器会检讨3个顺序是或不是适合里氏代换原则,那是一个与落到实处非亲非故的、纯语法意义上的自作者批评,但Java编译器的自作者批评是有局限的。

澳门威尼斯人网址 1

      在Sunny软件公司开发的CRM系统中,客户(Customer)可以分为VIP客户(VIPCustomer)和普通客户(CommonCustomer)两类,系统需要提供一个发送Email的功能,原始设计方案如图1所示:

图1原始结构图

      在对系统进行进一步分析后发现,无论是普通客户还是VIP客户,发送邮件的过程都是相同的,也就是说两个send()方法中的代码重复,而且在本系统中还将增加新类型的客户。为了让系统具有更好的扩展性,同时减少代码重复,使用里氏代换原则对其进行重构。

图2  重构后的结构图

     
在本实例中,可以设想增添贰个新的空洞客户类Customer,而将CommonCustomer和VIPCustomer类作为其子类,邮件发送类EmailSender类针对抽象客户类Customer编程,依照里氏代换原则,可以承受基类对象的地点一定可以经受子类对象,由此将EmailSender中的send()方法的参数类型改为Customer,如若急需充实新类型的客户,只需将其当做Customer类的子类即可。重构后的构造如图2所示:

      里氏代换原则是兑现开闭原则的机要艺术之一。在本实例中,在传递参数时利用基类对象,除此以外,在概念成员变量、定义局地变量、明确方法再次来到类型时都可采纳里氏代换原则。针对基类编程,在程序运维时再鲜明具体子类。

澳门威尼斯人网址 2

图2  重构后的结构图

     
里氏代换原则是已毕开闭原则的主要方法之一。在本实例中,在传递参数时使用基类对象,除此以外,在概念成员变量、定义局地变量、明确方法重临类型时都可采取里氏代换原则。针对基类编程,在程序运转时再明确具体子类。

相关文章