Zasadniczo, co chcę zrobić, to wymuszenie podklasy w celu wywołania abstrakcyjnej metody nadklasy (zaimplementowanej w podklasie), więc nie muszę jej jawnie zapisywać czas tworzę nową podklasę.Jak zmusić podklasę do wywołania abstrakcyjnie zaimplementowanej metody
Napisałem go raz w konstruktorze nadklasy, ponieważ chcę go wymusić na każdą implementację.
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
}
}
Oczywiście, nadklasą nie może nazwać go od sposobu jego abstrakcyjnej (tak nieokreślonej), ale jego klasa abstrakcyjna, więc nie może być instanciated, musi powierzyć zadanie jej podklas, więc dlaczego Czy nie nazywają abstrakcyjną, ale teraz wdrożoną metodą?
EDIT Zobacz właściwość podklasy myTextBox
i realizację
Które podejście sądzisz zrobić init()
? Wyjąć = null
w deklaracji majątkowych (duhhh)
lub usunąć init()
w nadrzędnej i wyraźnie nazywając go w konstruktorze podklasy (to właśnie chciałem uniknąć, ponieważ będę musiał napisać to 100% czasu ..)
To zadziała. To zdecydowanie nie jest twój rzeczywisty kod - twój rzeczywisty kod musi się różnić od tego w jakiś ważny sposób. Dlaczego nie zamieścić swojego prawdziwego kodu i daj nam rzucić okiem? –
Rzeczywiście!zobacz mój komentarz na temat odpowiedzi Jona Skeeta i moje zaktualizowane pytanie :) – dominicbri7