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

を呼び出さなくても、 を呼び出して値をTest.initialize()に設定したいと思います。スーパークラスで抽象関数を定義することも同様に避けたいと思います。これは可能ですか?mIsInitializedtruesuper.initialize()

4

3 に答える 3

6

これを行うことは可能ですが、オーバーライドすることではできませんinitializeBaseTestクラスでは、オーバーライドできないようにマークしますinitializefinalinitialize、別のメソッドを呼び出してサブクラスの初期化を行います。

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ことが保証されており、 を呼び出さずに必要に応じて実装できます。 スーパークラスの初期化を止めることはできません。mIsInitializedtrueTestinitializeFurthersuper.initialize()TestBaseTest

initialize任意のBaseTestインスタンスで呼び出されると、initializeロジックは常に実行されます。

于 2014-03-12T21:17:08.980 に答える
3

@rgettmanら。Template パターンの使用を求めています。その中で、サブクラスが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 に答える