簡體   English   中英

自動調用超類方法

[英]Call super class method automatically

考慮以下課程

class A{
    public void init(){
        //do this first;
    }
    public void atEnd(){
        //do this after init of base class ends
    }
}

class B1 extends A{

    @Override
    public void init()
    {
        super.init();
        //do new stuff.
        //I do not want to call atEnd() method here...
    }
}

我有幾個B1,B2,... Bn子類已經開發。 它們全部都擴展了類A。如果我想在所有類中添加新功能,最好的方法是在類A中的方法中進行定義。但是條件是該方法應始終在該方法被自動調用之前子類的init()方法結束。 一種基本方法是在子類的init()方法末尾再次添加atEnd()方法調用。 但是還有其他方法可以巧妙地做到這一點嗎?

一種方法是使init() final,然后將其操作委托給第二個可重寫的方法:

abstract class A {
  public final void init() {
    // insert prologue here
    initImpl();
    // insert epilogue here
  }
  protected abstract void initImpl();
}

class B extends A {
  protected void initImpl() {
    // ...
  }
}

每當有人調用init() ,都會自動執行序言和結語,並且派生類不必執行任何操作。

另一個想法是編織一個方面。 在建議之前和之后添加切入點。

使init() final ,並為人們提供一個單獨的方法來覆蓋中間的init()調用:

class A{
    public final void init(){
        //do this first;
    }

    protected void initCore() { }

    public void atEnd(){
        //do this after init of base class ends
    }
}

class B1 extends A{

    @Override
    protected void initCore()
    {
        //do new stuff.
    }
}

其他答案是合理的解決方法,但可以解決一個確切的問題:不,沒有辦法自動執行此操作。 您必須顯式調用super.method()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM