基本的に、私がしたいのは、サブクラスが抽象スーパークラスメソッド(サブクラスで実装されている)を呼び出すようにすることです。私は新しいサブクラスを作成します。抽象実装のメソッドを呼び出すようにサブクラスを強制する方法
スーパークラスのコンストラクタに一度書きました。なぜなら、すべての実装でそれを強制したいからです。
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
}
}
もちろん、スーパークラスは本当に、その抽象的(そう未定義)メソッドので、それを呼び出すことはできませんが、それはインスタンス化することはできませんので、その抽象クラスは、そのサブクラスにタスクを委任する必要があり、なぜ彼らは抽象と呼ばれることはできませんが、今は実装されたメソッドですか?
EDIT は、サブクラスのプロパティmyTextBox
とinit()
実装あなたは私がやるべきだと思いますアプローチ
を参照してください?プロパティの宣言(duhhh)
の= null
を削除するか、スーパークラスのinit()
を削除し、明示的にサブクラスのコンストラクタで呼び出す(これは私が避けたかったので、100%の時間を書きます..)
それは動作します。これは明らかにあなたの実際のコードではありません - 実際のコードはいくつかの重要な点でこれと異なる必要があります。実際のコードを投稿して見てみましょう。 –
確かに!Jon Skeetの答えと私の更新された質問に私のコメントを参照してください:) – dominicbri7