里氏替换原则(LSP)
子类应当可以替换父类并出现在父类能够出现的地方。简单来说就是继承
解决问题:当类在继承的时候,如果一旦子类的方法出现变更则继承的类也可能出现问题。
如何解决:
- 子类可以实现父类的方法,但是不要覆盖(重写)父类的方法。
- 子类可以增加自定义的方法(可以拓展方法)
- 如果一定要做这种事,通过残数控制,子类可以定义更多的参数(方法的重载),方法名一样,但参数类型,个数不一样。
优点:
可以大大的减少程序的bug和增加程序的可读性。
例子:
不遵循里氏替换原则的样子:
package LSP;
public class A {
int fun1(int a, int b)
{
return a+b;
}
}
package LSP;
public class B extends A {
int fun1(int a,int b)
{
return a-b;
}
int fun2(int a, int b)
{
return fun1(a,b)+100;
}
}
package LSP;
public class Client2 {
public static void main(String args[])
{
B b = new B();
System.out.println("1+2 = "+ b.fun1(1, 2));
System.out.println("1+2+100 = " + b.fun2(1, 2));
System.out.println("1-2 = "+ b.fun1(1, 2));
}
}
不遵循里氏替换原则的后结果:
1+2 = -1
1+2+100 = 99
1-2 = -1
遵循里氏替换原则:
package LSP;
public class A {
int fun1(int a, int b)
{
return a+b;
}
}
package LSP;
public class B extends A {
int fun3(int a,int b)
{
return a-b;
}
int fun2(int a, int b)
{
return fun1(a,b)+100;
}
}
package LSP;
public class Client2 {
public static void main(String args[])
{
B b = new B();
System.out.println("1+2 = "+ b.fun1(1, 2));
System.out.println("1+2+100 = " + b.fun2(1, 2));
System.out.println("1-2 = "+ b.fun3(1, 2));
}
}
遵循里氏替换原则结果:
1+2 = 3
1+2+100 = 103
1-2 = -1