原文:六大设计原则(二)里氏替换原则LSP
里氏替换原则LSP(Liskov Subsituation Principle)
里氏替换原则定义
所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换。
LSP的四层含义
- 子类必须完全实现父类的方法
- 子类可以自己的个性(属性和方法)
- 覆盖或实现父类的方法时输入参数可以被放大
- 覆盖或实现父类的方法时输出结果可以被缩小
LSP的定义含义1——子类必须完全实现父类的方法
假设如下场景:定义一个枪支抽象类,一个场景类,三个枪支实现类,一个士兵类。此处,三个枪支完全实现了父类的方法。
关联关系:实线箭头
泛化关系:实线空心箭头(继承关系)
依赖关系:虚线箭头(使用关系)一个类需要另一个类的协助
抽象枪支类:射击功能
package des.lsp;
/**
* 抽象类 枪支
*/
abstract class AbstractGun {
//射击功能
public abstract void shoot();
}
子类实现
package des.lsp;
/**
* 手枪
*/
public class HandGun extends AbstractGun {
@Override
public void shoot() {
System.out.print("手枪可以射击");
}
}
package des.lsp;
/**
* 手枪
*/
public class MachineGun extends AbstractGun {
@Override
public void shoot() {
System.out.print("步枪可以射击");
}
}
package des.lsp;
/**
* 步枪
*/
public class Rifle extends AbstractGun {
@Override
public void shoot() {
System.out.print("步枪可以射击");
}
}
士兵类:士兵类使用的是抽象枪支类,具体的需要在场景类中指定。
类中调用其他类必须使用父类或接口,若不能使用则其实已经违背了LSP原则。
package des.lsp;
public class Soldier {
private AbstractGun gun;
public void setGun(AbstractGun _gun){