里氏置换原则(Liskov Substitution Principle),简称LSP。所有引用基类的地方必须能够透明的使用其子类对象。也就是说,只要父类出现的地方子类就能够出现,而且替换为子类不会产生任何错误或异常。
里氏置换原则(Liskov Substitution Principle),简称LSP
定义:
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
所有引用基类的地方必须能够透明的使用其子类对象。
也就是说,只要父类出现的地方子类就能够出现,而且替换为子类不会产生任何错误或异常。但是反过来,子类出现的地方,替换为父类就可能出现问题了。
这个原则是为良好的继承定义一个规范,简单的讲,有4层含义:
一、子类必须完全实现父类的方法
定义一个抽象类
- public abstract class ViewPoint {
- //去丽江旅游
- public abstract void where();
- }
下面两个类是实现这个抽象类
- public class Lijiang extends ViewPoint {
- @Override
- public void where() {
- System.out.println("欢迎来到丽江...");
- }
- }
- public class Zhangjiajie extends ViewPoint {
- @Override
- public void where() {
- System.out.println("欢迎来到张家界...");
- }
- }
人物是涂涂,在里面设置类类型来传递参数。此时涂涂要去的旅游景点还是抽象的
- public class Tutu {
- //定义要旅游的景点
- private ViewPoint viewpoint;
- //涂涂要去的景点
- public void setViewPoint(ViewPoint viewpoint)
- {
- this.viewpoint = viewpoint;
- }
- public void travelTo()
- {
- System.out.println("涂涂要去旅游了");
- viewpoint.where();
- }
- }
场景类。设置具体要去的景点
- public class Sence {
- public static void main(String args[])
- {
- Tutu tutu = new Tutu();
- //设置要去的旅游景点
- tutu.setViewPoint(new Lijiang());
- tutu.travelTo();
- }
- }
运行结果:
涂涂要去旅游了
欢迎来到丽江...
二、子类可以有自己的特性
也就是说在类的子类上,可以定义其他的方法或属性
三、覆盖或者实现父类的方法时输入参数可以被放大
父类能够存在的地方,子类就能存在,并且不会对运行结果有变动。反之则不行。
父类,say()里面的参数是HashMap类型,是Map类型的子类型。(因为子类的范围应该比父类大)
- import java.util.Collection;
- import java.util.HashMap;
- public class Father {
- public Collection say(HashMap map)
- {
- System.out.println("父类被执行...");
- return map.values();
- }
- }
子类,say()里面的参数变成了Map类型,Map范围比HashMap类型大,符合LSP原则。注意这里的say不是覆写父类的say,因为参数类型不同。而是重载。
- import java.util.Collection;
- import java.util.Map;
- /*
- * 子类继承了父类的所有属性
- */
- public class Son extends Father {
- //方法输入参数类型
- public Collection say(Map map)
- {
- System.out.println("子类被执行...");
- return map.values();
- }
- }
场景类
- import java.util.HashMap;
- public class Home {
- public static void main(String args[])
- {
- invoke();
- }
- public static void invoke()
- {
- //父类存在的地方,子类就应该能够存在
- //Father f = new Father();
- Son s = new Son();
- HashMap map = new HashMap();
- //f.say(map);
- s.say(map);
- }
- }
无论是用父类还是子类调用say方法,得到的结果都是
父类被执行...
但是,如果将上面Father里的say参数改为Map,子类Son里的say参数改为HashMap,得到的结果就变成了
f.say(map)结果:父类被执行...
s.say(map)结果: 子类被执行...
这样会造成逻辑混乱。所以子类中方法的前置条件必须与父类中被覆写的前置条件相同或者更宽。
四、覆写或者实现父类的方法时输出结果可以被缩小
其实与上面的类似,也就是父类能出现的地方子类就可以出现,而且替换为子类不会产生任何错误或者异常,使用者也无需知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就适应。(毕竟子类的范围要>=父类的范围)
原文链接:http://www.cnblogs.com/loulijun/archive/2012/03/04/2379082.html
相关推荐
设计模式6大原则:里氏置换原则
OO设计原则 --OO设计的LSP里氏替换原则 ,所以使用基类代码的地方,用派生类代码替换后,能够正确的执行动作处理。 ◇ 换句话说,如果派生类替换了基类后,不能够正确执行动作,那么他们的继承关系就应该废除。
设计模式之里氏转换原则
计算机后端-Java-图解java设计模式014 里氏替换.avi
计算机后端-Java-图解java设计模式015 里氏替换.avi
例如:随着计算机的不断发展,程序学习这门技术也越来越重要,很多人都开启了...面向对象设计原则一共有七个:开闭原则、里氏替换原则、依赖倒转原则、单一职责原则、接口隔离原则、组合/聚合复用原则、迪米特法则。
这一个学习java的笔记,里面主要介绍java的里氏代换原则
http://blog.csdn.net/xingjiarong/article/details/50081857
1.单一职责原则: 不要存在多于一个导致类变更的原因 ...接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
关于设计模式中涉及的原则与模式,项目使用java编码实现设计模式。 设计模式 原则 单一职责原则 单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。 如果一个类承担的职责过多,就等于把这些职责耦合...
Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1...
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元...
那些以前已经体验过设计模式的读者可能希望跳过本书的第ⅰ部分,这部分介绍了gof提出的设计模式以及其他常见设计原则,包括s.o.l.i.d原则和martinfowler的企业设计模式。所有的代码示例均采用c#语言编写,但这些概念...
里氏代换原则案例程序LSP.zip
主要介绍了Java的设计模式中里氏替换原则的意义,文中举例来说明里氏替换原则中强调的继承特性方面可能带来的问题,需要的朋友可以参考下
java 设计模式与Jar库 里氏代换原则LSP 依赖倒转原则DIP 接口隔离原则ISP 合成/聚合复用原则CARP
详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能...
* Lesson 3 [单一原则和里氏替换原则](https://github.com/AlfredTheBest/Design-Pattern/tree/master/lesson3) * Lesson 4 [依赖倒置原则](https://github.com/AlfredTheBest/Design-Pattern/tree/master/lesson4) ...