我有一些类继承 SubClass < MidClass < SuperClass 并希望为所有这些类执行一些向上的任务。TASK 相当复杂,仅在 3 个类中进行了微小的更改,我将它们移到了私有方法 m2() 中。
我目前的解决方案是非常样板:
class SuperClass {
protected void m1() {
//TASK (calls m2())
}
private void m2() {
//...
}
}
class MidClass extends SuperClass {
protected void m1() {
//same TASK (calls m2())
super.m1();
}
private void m2() {
//...
}
}
class SubClass extends MidClass {
protected void m1() {
//same TASK (calls m2())
super.m1();
}
private void m2() {
//...
}
}
我可以利用一些代码重用机制而不是复制 TASK 吗?
像下面这样的东西,m1() 只在 SuperClass 中,不起作用:
class SuperClass {
protected final void m1() {
//TASK (calls m2())
if (!(this.getClass().equals(SuperClass.class))) {
super.m1();
}
}
因为 super.m1() 不是指在超类的上下文中执行相同的继承方法,而是指被覆盖的方法实现。由于 m1() 在 Object 中不存在,我另外得到一个编译器错误......
将 TASK 放入 SuperClass 中受保护的最终 helper() 方法中并调用 helper() 而不是复制 TASK 将不起作用,因为那时总是调用 SuperClass.m2() 。
我能想到的唯一选择是缓慢、复杂和不安全:使用类型标记作为参数,即protected final void m1(Class<? extends SuperClass> clazz)
在 SuperClass 中,并通过反射完成任务(需要将 m2() 设为公共静态或在 m2() 上使用 setAccessible(true)) .
你知道更好的解决方案吗?奥普?也许是一些可以将方法注入类的框架(如在 C# 中)?还是我错过了什么???