Básicamente, lo que quiero hacer es forzar la subclase para llamar a un método abstracto de superclase (implementado en la subclase), así que no tengo que escribirlo explícitamente tiempo que creo una nueva subclase.Cómo forzar a la subclase a llamar a un método abstracto implementado
Lo escribí en el constructor de la superclase una vez, porque quiero que lo fuerce para cada implementación.
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
}
}
Por supuesto, la superclase en realidad no puede llamar desde su método de un resumen (de modo indefinido), pero es una clase abstracta por lo que no puede ser instanciado, se debe delegar la tarea a sus subclases, así que por qué ¿No pueden llamar al método abstracto pero ahora implementado?
EDITAR ver la propiedad subclase myTextBox
y la aplicación init()
¿Qué enfoque le parece que debería hacer? Retire la = null
en la declaración de propiedad (duhhh)
o eliminar la init()
en la superclase y explícitamente llamándolo en el constructor de la subclase (esto es lo que quería evitar, ya que voy a tener que escribir el 100% de las veces ..)
Eso funcionará. Evidentemente, este no es su código real; su código real debe diferir de este de alguna manera importante. ¿Por qué no publicar su código real y echarnos un vistazo? –
¡De hecho!ver mi comentario sobre la respuesta de Jon Skeet y mi pregunta actualizada :) – dominicbri7