是否有可能为子类中的方法定义一些默认行为,而不必调用super
?
例如:假设我们想在超类中设置一个boolean
值并且你想从子类中隐藏它,有没有办法隐藏布尔值的修改?假设我们有以下基类BaseTest
public class BaseTest {
private boolean mIsInitialized = false;
public BaseTest() {
}
public void initialize() {
mIsInitialized = true;
}
}
及其子类Test
:
public class Test extends BaseTest {
public Test() {
}
public void initialize() {
}
}
我希望调用Test.initialize()
将mIsInitialized
值设置为true
,而无需致电super.initialize()
。我同样希望避免在超类中定义抽象函数。
这甚至可能吗?
答案 0 :(得分:6)
可以这样做,但不能覆盖initialize
。在BaseTest
课程中,将initialize
标记为final
,以便无法覆盖。在initialize
中,调用另一个方法来进行任何子类初始化。
public final void initialize() {
mIsInitialized = true;
initializeFurther();
}
你说没有abstract
方法。但是,initializeFurther
可以变为空。
protected void initializeFurther() {}
然后,子类Test
只需要覆盖initializeFurther
。
public class Test extends BaseTest {
@Override
protected void initializeFurther() {
// Initialize Test here.
}
}
基类的initialize
方法可以保证将mIsInitialized
设置为true
,而Test
可以实现initializeFurther
但不需要调用super.initialize()
}}。 Test
无法阻止超类BaseTest
进行初始化。
在任何initialize
实例上调用BaseTest
时,initialize
逻辑将始终运行。
答案 1 :(得分:3)
@rgettman等。正在呼吁使用Template pattern。其中你明确指出,子类可以通过不是initialize
的特定可覆盖方法“挂钩”到超类的操作,这似乎违背了你的问题的精神。
您还可以使用面向方面的框架(如AspectJ)将各种不可见的行为附加到方法调用中。
答案 2 :(得分:0)
如果阻止Test覆盖BaseTest的initialize(),可以直接调用BaseTest的initialize()。这是一些测试代码:
public class BaseTest {
private boolean mIsInitialized = false;
public BaseTest() {
}
public void initialize() {
mIsInitialized = true;
System.out.println(mIsInitialized);
}
public static void main(String[] args){
Test test = new Test();
test.initialize();
}
}
class Test extends BaseTest {
public Test() {
}
}