Как заставить подкласс вызывать абстрактный реализованный метод

По сути, я хочу заставить подкласс вызывать абстрактный метод суперкласса (реализованный в подклассе), поэтому мне не нужно явно писать его каждый раз, когда я создать новый подкласс.

Я написал его в конструкторе суперкласса один раз, потому что хочу, чтобы он принудительно выполнял его для каждой реализации.

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
    }
}

Конечно, суперкласс не может на самом деле вызывать его, так как он является абстрактным (так что undefined ), но это класс ABSTRACT, поэтому он не может быть создан, он должен делегировать задачу своим подклассам, так почему они не могут вызвать абстрактный, но теперь реализованный метод?

EDIT См. Свойство подкласса myTextBox и реализацию init ()

Какой подход, по вашему мнению, мне следует использовать? Удалите = null в объявлении свойства (duhhh)

или удалите init () в суперклассе и явно вызовите его в конструкторе подкласса (это то, что я хотел избегайте, так как мне придется писать его в 100% случаев ..)

6
задан dominicbri7 20 July 2011 в 13:58
поделиться