1.学习
1.里氏替换原则
原因:继承父类,可能会不小心改掉里面的方法,导致错误
代码:
public class Liskov {
public static void main(String[] args) {
A a=new A();
System.out.println("11-3="+a.func1(11,3));//8
System.out.println("1-8="+a.func1(1,8));//-7
System.out.println("-----------------------");
B b=new B();
System.out.println("11-3="+b.func1(11,3));//14 错
System.out.println("1-8="+b.func1(1,8));//9 错
System.out.println("11+3+9="+b.func1(11,3));//14 错
}
}
class A {
/**
* 返回两个数的差
* @param num1
* @param num2
* @return
*/
public int func1(int num1,int num2){
return num1-num2;
}
}
/**
* B继承A,并增加方法
*/
class B extends A{
//不小心重写了父类的方法,导致出差
@Override
public int func1(int num1, int num2) {
return num1+num2;
}
public int func2(int a,int b){
return func1(a,b)+9;
}
}
用这个原则来解决。
方法:让他们继承一个更原始的类
组合的形式来调用A的方法
public class Liskov1 {
public static void main(String[] args) {
A1 a=new A1();
System.out.println("11-3="+a.func1(11,3));
System.out.println("1-8="+a.func1(1,8));
System.out.println("-----------------------");
B1 b=new B1();
System.out.println(b.func2(11,3));;
System.out.println(b.func3(11,3));
}
}
class Base{
}
class A1 extends Base {
/**
* 返回两个数的差
* @param num1
* @param num2
* @return
*/
public int func1(int num1,int num2){
return num1-num2;
}
}
/**
* B继承A,并增加方法
*/
class B1 extends Base{
private A1 a1=new A1();
public int func2(int a,int b){
return this.a1.func1(a,b)+9;
}
public int func3(int a,int b){
return this.a1.func1(a,b);
}
}
这样就不会误改值了