面向对象设计原则之里氏代换原则
来源:互联网 发布:数据库 schema 知乎 编辑:程序博客网 时间:2024/05/28 23:23
里氏代换原则由2008年图灵奖得主、美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出。其严格表述如下:
如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1代换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。这个定义比较拗口且难以理解,因此我们一般使用它的另一个通俗版定义:
里氏替换原则(Liskov Substitution Principle,LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。
里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。
例如:我喜欢动物,那么我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此判定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。
里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时在确定其子类类型,用子类类型来替换父类对象。
在使用里氏替换原则时需要注意如下几个问题:
1、子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。根据里氏替换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存在子类中,在父类中不能提供相应的声明,则无法在以父类定义的对象中使用该方法。
2、我们在运用里氏替换原则时,尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。里氏替换原则是开闭原则的具体实现手段之一。
3、Java语言中,在编译阶段,Java编译器会检查一个程序是否符合里氏代换原则,这是一个与实现无关的、纯语法意义上的检查,但Java编译器的检查是有局限的。
里氏替换原则是实现开闭原则的重要方式之一。
- 面向对象设计原则---里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之里氏代换原则
- 面向对象设计原则之二--里氏代换原则
- 关于控件滑动至顶部的监听
- 【UOJ22】. [UR #1]外星人
- 【消息队列MQ】各类MQ比较
- zookeeper应用场景-消息的订阅和发布
- javaweb域对象
- 面向对象设计原则之里氏代换原则
- unit12不同系统文本间的文件传输
- JavaScript之深入理解偏移量offset
- 【JavaEE】servlet技术
- Java:JFrame与Frame的区别
- 测试之路--Python
- Pandas标记删除重复记录
- MongoDB进阶(八)Spring整合MongoDB(Spring Data MongoDB)
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解