如何应对继承的双面性
继承既强大又有破坏性,那怎么办呢?
1)避免使用继承;
2)正确使用继承。
我们先来看怎么避免继承,有三种方法:
·使用final关键字;
·优先使用组合而非继承;
·使用接口。
1.使用final避免继承
2.优先使用组合而非继承
使用组合可以抵挡父类变化对子类的影响,从而保护子类,应该优先使用组合。
还是上面的例子,我们使用组合来重写一下子类,如代码清单所示。
代码清单4-12 使用组合实现子类Child
public class Child {
private Base base;
private long sum;
public Child(){
base = new Base();
}
public void add(int number) {
base.add(number);
sum+=number;
}
public void addAll(int[] numbers) {
base.addAll(numbers);
for(int i=0;i<numbers.length;i++){
sum+=numbers[i];
}
}
public long getSum() {
return sum;
}
}
这样,子类就不需要关注基类是如何实现的了,基类修改实现细节,增加公开方法,也不会影响到子类了。但组合的问题是,子类对象不能当作基类对象来统一处理了。解决方法是使用接口
。接口是什么呢?我们留待下章介绍。
3.正确使用继承
如果要使用继承,怎么正确使用呢?使用继承大概主要有三种场景:
1)基类是别人写的,我们写子类;
2)我们写基类,别人可能写子类;
3)基类、子类都是我们写的。
https://www.bilibili.com/video/BV1Yv4y1d7zk/?spm_id_from=333.999.0.0https://www.bilibili.com/video/BV1Yv4y1d7zk/?spm_id_from=333.999.0.0