设计模式之里式替换原则详解
里式替换原则
什么是里式替换原则?
- 定义一:所有引用基类的地方能透明的使用其子类的对象
- 定义二:如果对每一个类型为T1的对象O1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都代换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
- 直白点:可以将一个基类对象替换成其子类的对象,程序不会产生任何的异常和报错,但是反过来就不行。不能将子类对象替换成基类对象。就好像,我喜欢动物,所以一定会喜欢狗,但是反过来就不行(这里不许较真,只是做个比方)。
在使用里式替换时,如果不小心,就容易发生以下的错误。
问题:如果我原来有一个类A,后来有一个类B,类B继承A,并且重写了类A中的方法,这时候,就有可能会出现导致原来的程序出现错误。
案例:
类A
class A{
public int func1(int a, int b){
return a-b;
}
运行类A
public class Client{
public static void main(String[] args){
A a = new A();
System.out.println("100-50="+a.func1(100, 50));
System.out.println("100-80="+a.func1(100, 80));
}
}
运行结果:
100-50=50
100-80=20
类B
class B extends A{
public int func1(int a, int b){
return a+b;
}
public int func2(int a, int b){
return func1(a,b)+100;
}
}
运行类B
public class Client{
public static void main(String[] args){
B b = new B();
System.out.println("100-50="+b.func1(100, 50));
System.out.println("100-80="+b.func1(100, 80));
System.out.println("100+20+100="+b.func2(100, 20));
}
}
运行结果:
100-50=150
100-80=180
100+20+100=220
我们发现原本运行正常的相减功能发生了错误。原因就是类B在给方法起名时无意中重写了父类的方法,造成所有运行相减功能的代码全部调用了类B重写后的方法,造成原本运行正常的功能出现了错误。
原因:
https://www.cnblogs.com/qingmuchuanqi48/articles/14984315.html
里式替换的原则
子类可以拓展父类的方法,但是不能改变父类原有的功能
本文来自博客园,作者:King-DA,转载请注明原文链接:https://www.cnblogs.com/qingmuchuanqi48/articles/14984317.html

浙公网安备 33010602011771号