По сути, я хочу заставить подкласс вызывать абстрактный метод суперкласса (реализован в подклассе), поэтому мне не нужно явно писать его каждый раз, когда я создаю новый подкласс .
Я написал это один раз в конструкторе суперкласса, потому что я хочу, чтобы он вызывал его для каждой реализации.
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, поэтому его нельзя создавать, он должен делегировать задачу своим подклассам, так почему они не могут вызвать абстрактный, но теперь реализованный метод?
EDIT
См. Свойство подкласса myTextBox
и реализацию init()
Как вы думаете, какой подход я должен сделать? Удалите = null
в декларации свойства (duhhh)
или удалите init()
в суперклассе и явно вызовите его в конструкторе подкласса (это то, чего я хотел избежать, поскольку мне придется писать его 100% времени ..)