Digamos que tengo una clase JavaEjecución de un método después del constructor de cualquier clase derivada
abstract class Base {
abstract void init();
...
}
y sé que cada clase derivada tendrá que llamar init()
después de que se construye. Podría, por supuesto, sólo tiene que llamar en los constructores de las clases de derivados:
class Derived1 extends Base {
Derived1() {
...
init();
}
}
class Derived2 extends Base {
Derived2() {
...
init();
}
}
pero esto rompe 'No te repitas' principio bastante mal (y no van a ser muchas subclases de Base
). Por supuesto, la llamada init()
no puede entrar en el constructor Base()
, ya que se ejecutará demasiado pronto.
¿Alguna idea de cómo evitar este problema? Estaría muy feliz de ver una solución Scala, también.
ACTUALIZACIÓN: He aquí una versión genérica del enfoque Método de fábrica:
interface Maker<T extends Base> {
T make();
}
class Base {
...
static <T extends Base> T makeAndInit(Maker<T> maker) {
T result = maker.make();
result.init();
return result;
}
}
ACTUALIZACIÓN 2: Esta pregunta es, básicamente, "¿cómo se utiliza el método de plantilla para los constructores"? Y la respuesta parece ser: "Puedes, pero es una mala idea". Así que puedo hacer una fábrica de plantillas (Método de plantilla + Fábrica abstracta) en su lugar.
Si init() es abstracto en la clase base, ¿por qué cada clase derivada debe llamarlo? ¿Qué pasa si no lo hacen? –
¿Por qué no llamas a init() en el constructor de la clase 'Base'? – aioobe
@Skip Head: no se inicializarán correctamente. –