Diciamo che ho una classe JavaEsecuzione di un metodo dopo il costruttore di una classe derivata
abstract class Base {
abstract void init();
...
}
e so che ogni classe derivata dovrà chiamare init()
dopo che è costruito. Potrei, naturalmente, è sufficiente chiamare nei costruttori delle classi derivate:
class Derived1 extends Base {
Derived1() {
...
init();
}
}
class Derived2 extends Base {
Derived2() {
...
init();
}
}
ma questo si rompe 'Non ripetere te stesso' principio piuttosto male (e ci stanno per essere molte sottoclassi di Base
). Naturalmente, la chiamata init()
non può andare al costruttore Base()
, dal momento che sarebbe stato giustiziato troppo presto.
Delle idee come aggirare questo problema? Sarei abbastanza felice di vedere anche una soluzione di Scala.
UPDATE: Ecco una versione generica del metodo Factory Method:
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;
}
}
UPDATE 2: Questa domanda è fondamentalmente "come si usa Template Method per i costruttori"? E la risposta sembra essere, "Puoi, ma è una cattiva idea". Quindi posso creare una fabbrica di modelli (metodo di template + factory astratta).
Se init() è astratto nella classe base, allora perché ogni classe derivata deve chiamarla? Cosa succede se non lo fanno? –
Perché non chiamate init() nel costruttore della classe 'Base'? – aioobe
@Skip Head: non saranno inizializzati correttamente. –