簡體   English   中英

如何強制子類調用抽象實現的方法

[英]How to force subclass to call an abstract implemented method

基本上,我要做的就是強制子類調用一個抽象超類方法(在子類中實現),這樣就不用每次新建子類的時候都顯式地寫了。

我在超類的構造函數中寫過一次,因為我希望它為每個實現強制它。

public abstract class SupahClass {
    public SupahClass() {
        doStuff(); // It IS executed when the subclass constructor is called
        init(); // NOT executed, even though it's implemented
    }

    private void doStuff() { ... }        

    protected abstract void init();
}

public class SomeSubClass extends SupahClass {

    // The problem lies HERE: this is executed AFTER init() ... so it gets NULL again
    private TextBox myTextBox = null;

    public SomeSubClass() {
        super(); // invokes the super constructor, so init() should be called
        // I could call init(); here EACH time i create a new subclass... but no :)
    }

    @Override
    public void init() {
        this.myTextBox = new TextBox(); // Executed BEFORE its declared as null above
    }
}

當然,超類不能真正調用它,因為它是一個抽象(未定義)方法,但它是一個 ABSTRACT class 所以它不能被實例化,它必須將任務委托給它的子類,所以為什么他們不能調用抽象但現在實現方法?

編輯查看子類屬性myTextBoxinit()實現

你認為我應該采取哪種方法? 刪除屬性聲明中的= null (duhhh)

或刪除超類中的init()並在子類構造函數中顯式調用它(這是我想避免的,因為我必須 100% 的時間編寫它..)

我無法重現這個。 init()被調用,假設沒有首先拋出異常。 簡短但完整的示例:

abstract class Superclass {
   public Superclass() {
       init();
   }

   protected abstract void init();
}

class Subclass extends Superclass {
   public Subclass() {
       super();
   }

   @Override
   public void init() {
       System.out.println("Subclass.init called");
   }
}

public class Test {    
    public static void main(String[] args) throws Exception {
        new Subclass();
    }
}

按預期打印“Subclass.init called”。 我懷疑您沒有向我們展示的代碼中還有其他問題。

請注意,在構造函數中調用虛方法是有風險的——例如,子類還沒有被初始化——所有的變量都會有它們的默認值。 這通常是一種要避免的模式。

抽象類可以調用抽象方法。

您可以通過將聲明更改為:

private TextBox myTextBox;

分配給 null 沒有任何用處。 如果沒有超類,它什么也不做,因為無論如何字段都初始化為 null。 由於有一個超類,它就像對腳的槍擊一樣。 所以,擺脫它。

您是否使用調試器來了解代碼在做什么?

構造順序為 1. 基類 class 的構造函數 2. 初始化派生 class 的所有成員 3. 派生 class 的構造函數。

在您的情況下,步驟 1 初始化成員(在派生的 class 的 init 中 - 通過多態調用調用),但步驟 2 將其設置為 null。

暫無
暫無

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

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