里氏置换原则(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)结果: 子类被执行...
这样会造成逻辑混乱。所以子类中方法的前置条件必须与父类中被覆写的前置条件相同或者更宽。
四、覆写或者实现父类的方法时输出结果可以被缩小
其实与上面的类似,也就是父类能出现的地方子类就可以出现,而且替换为子类不会产生任何错误或者异常,使用者也无需知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就适应。(毕竟子类的范围要>=父类的范围)
分享到:
相关推荐
里氏转换原则是设计模式中一个重要的理论基础,它对实现这些模式起到关键的指导作用。 1. **什么是里氏转换原则:** - LSP指出,如果一个软件实体使用的是父类型的引用,那么它应该能透明地使用子类型的实例,而...
设计模式原则:单一职责原则,里氏替换,依赖倒转,接口隔离,开放关闭等等。
这个PDF文档“24种设计模式介绍与6大设计原则”旨在帮助开发者理解和应用这些模式,提高代码的可维护性和可扩展性。以下是其中的主要内容: 一、设计原则 1. 单一职责原则:一个类或模块应只有一个引起其变化的原因...
里氏替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,由Barbara Liskov在1988年提出。该原则指出,子类型必须能够替换它们的基类型而不影响程序的正确性。这意味着在软件系统中,...
设计模式六大原则:单一职责模式、开闭原则、接口隔离原则、里氏替换原则、依赖倒置原则、迪米特法则
JAVA的六大设计原则是对设计模式应用的指导,是使软件更加灵活、易于维护和复用的基础。这六大设计原则包括: 1. 单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因,即...
二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序...
详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。
设计模式六大原则与类的六种关系 设计模式六大原则是软件设计中遵循的一些基本原则,目的是为了使软件设计更加灵活、可维护和可扩展。六大原则分别是:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、...
六大设计原则是设计模式的基础,包括单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则和开闭原则。单一职责原则确保类只做一件事情,提高代码可读性和可维护性;里氏替换原则允许子类替换父类而...
本资源包含的"24种设计模式介绍与6大设计原则"高清PDF,对于Java开发者来说是一份宝贵的参考资料。 首先,我们来逐一探讨这24种设计模式: 1. 单例模式:确保一个类只有一个实例,并提供全局访问点。 2. 工厂方法...
php 设计模式六大原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 word版
1. **设计原则**:面向对象设计模式的基础,如单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP)。这些原则指导我们编写可维护、可扩展的代码。 2. **常见设计模式*...
以下是关于"Android 24种设计模式介绍与6大设计原则"的详细阐述: 一、六大设计原则 1. **单一职责原则(Single Responsibility Principle, SRP)**:一个类或模块应该只有一个引起它变化的原因。这意味着每个类应...
面向对象设计原则:面向对象设计原则、开闭原则、里氏替换原则、里氏替换原则、里氏替换原则