![](/img/trans.png)
[英]How to force implementation of a method in subclass without using abstract?
[英]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 所以它不能被實例化,它必須將任務委托給它的子類,所以為什么他們不能調用抽象但現在實現方法?
編輯查看子類屬性myTextBox
和init()
實現
你認為我應該采取哪種方法? 刪除屬性聲明中的= 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.