不使用super的子类方法的默认行为是什么?

时间:2014-03-12 21:07:30

标签: java inheritance subclass superclass information-hiding

是否有可能为子类中的方法定义一些默认行为,而不必调用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()。我同样希望避免在超类中定义抽象函数。 这甚至可能吗?

3 个答案:

答案 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() {
   }
}