背景
在看别人写过的代码的时候,发现了一个很有意思的设计。学艺不精一时之间不知道这代码是怎么调用的,做了一个简单的代码模型分析了一下,感觉比较有意思,就分享一下。
代码罗列与讲解
- 抽象父类
AFunc() 在父类中是一个空实现方法,BFunc()先调用了AFunc()进行入参处理,随后执行其它逻辑
public abstract class Father {
public void AFunc(Object args){}
public void BFunc(Object args) {
AFunc(args);
System.out.println("do something...");
}
}
- 子类Son1继承Father类,并重写了AFunc()
其中,otherFunc()中调用了父类的BFunc()方法
public class Son1 extends Father{
public void AFunc(Object args){
System.out.println("this is Son1");
}
public void otherFunc() {
Object obj = new Object();
BFunc(obj);
}
}
- 子类Son2继承Father类,不重写AFunc()
其中,otherFunc()中调用了父类的BFunc()方法
public class Son2 extends Father{
public void otherFunc() {
Object obj = new Object();
BFunc(obj);
}
}
这是基于我所接触的代码中的一个简化模型,项目中原本是有几十个子类实现了AFunc()与几十个不实现AFunc()的子类,共同点是都调用了父类的BFunc()。
执行结果
编写了一个简单的测试方法,测试结果如下
重写了抽象类空实现的方法的son1,调用父类方法BFunc()时,会调用自身的执行逻辑,反之son2调用BFunc()时会执行到父类AFunc()的空方法。
总结
复习了一下子类继承父类重写方法的执行优先级,也学习了一下设计思路。这种方法适用于子类都需要调用父类的一个公共方法,但有一些子类需要对入参进行特殊处理,得先处理再执行后面的逻辑的场景。当然你说写到具体的子类里面自己调用不行吗?那答案肯定是可以的。只是这样的设计会使代码主要更统一,稍微优雅一点点。