2

是否有可能为子类中的方法定义一些默认行为,而无需调用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() {
    }
}

我希望调用 toTest.initialize()mIsInitialized值设置为true而不必调用super.initialize(). 我同样想避免在超类中定义抽象函数。这甚至可能吗?

4

3 回答 3

6

可以做到这一点,但不能通过覆盖initialize. 在BaseTest类中,标记initializefinal不能被覆盖。在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方法保证设置mIsInitializedtrue,并且Test可以实现initializeFurther它想要的任何方式,而无需调用super.initialize(). Test无法阻止超类BaseTest进行初始化。

在任何实例initialize上调用时,逻辑将始终运行。BaseTestinitialize

于 2014-03-12T21:17:08.980 回答
3

@rgettman 等人。要求使用模板模式。在其中,您明确表明子类可能通过特定的可覆盖方法“挂钩”到超类的操作 not initialize,这似乎违背了您的问题的精神。

您还可以使用像 AspectJ 这样的面向方面的框架来将各种不可见的行为附加到方法调用上。

于 2014-03-12T21:19:53.063 回答
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() {
   }
}
于 2014-03-12T21:26:31.730 回答