Допустим, у меня есть класс Java
abstract class Base {
abstract void init();
...
}
и я знаю, что каждый производный класс должен будет вызывать init()
после его создания. Конечно, я мог бы просто назвать это в конструкторах производных классов:
class Derived1 extends Base {
Derived1() {
...
init();
}
}
class Derived2 extends Base {
Derived2() {
...
init();
}
}
но это довольно сильно нарушает принцип "не повторяйся" (и будет много подклассов Base
). Конечно, вызов init()
не может войти в конструктор Base()
, так как он будет выполнен слишком рано.
Есть идеи, как обойти эту проблему? Я был бы очень рад увидеть решение Scala тоже.
ОБНОВЛЕНИЕ: Вот общая версия подхода 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;
}
}
ОБНОВЛЕНИЕ 2: Этот вопрос в основном "как вы используете Template Template для конструкторов"? И ответ, кажется, "Вы можете, но это плохая идея". Поэтому я могу вместо этого создать Фабрику шаблонов (Template Method + Abstract Factory).