里氏替换原则: 继承在给程序带来便利的同时,也带来弊端。如果子类需要修改父类的方法时,必将对继承的整体体系造成破坏。在适当的情况下,可以通过聚合,组合,依赖 来解决问题。换句话说,所有引用基类的地方必须能透明的使用其子类的对象。
/**
* 底层普通基类,用来解决继承的耦合性问题
*/
class Base {
}
/**
* 实体类A,用于计算两个数的差
*/
class A extends Base {
// 返回两个数的差
public int publ1(int number1, int number2) {
return number1 - number2;
}
}
/**
* 实体类B,用于计算两个数的和,如若继承A类, 无意重写后,
* B类如果需要使用A类中的publ1方法就会造成逻辑错误
*/
class B extends Base {
// 使用聚合的方式引用A类中的方法
private A a = new A();
// 返回两个数的和
public int publ1(int number1, int number2) {
return number1 + number2;
}
// 返回两个数的差
public int publ2(int number1, int number2) {
return this.a.publ1(number1, number2);
}
}
public static void main(String[] args) {
A a = new A();
// 计算5和3的差,输出结果:5 - 3 = 2
System.out.println("5 - 3 = " + a.publ1(5, 3));
B b = new B();
// B继承A类,使用B类中的A类求差方法,无意重写A类方法,输出结果:5 - 3 = 8
System.out.println("5 - 3 = " + b.publ1(5, 3));
// B继承Base类,去除类的耦合性,计算5和3的和,输出结果:5 + 3 = 8
System.out.println("5 + 3 = " + b.publ1(5, 3));
// B继承Base类,去除类的耦合性,计算5和3的差,B聚合A类,输出结果:5 - 3 = 2
System.out.println("5 - 3 = " + b.publ2(5, 3));
}
解析:子类尽量不要重写父类中的方法,继承使得两个类的耦合性增强了,所以我们尽量使用聚合,组合,依赖 来解决问题
注意事项:
- 代码要遵循里氏替换原则;