在任何派生类的构造函数之后运行方法
假设我有一个 Java 类
abstract class Base {
abstract void init();
...
}
我知道每个派生类在构造后都必须调用。当然,我可以简单地在派生类的构造函数中调用它:init()
class Derived1 extends Base {
Derived1() {
...
init();
}
}
class Derived2 extends Base {
Derived2() {
...
init();
}
}
但这严重违反了“不要重复自己”的原则(并且会有很多子类)。当然,调用不能进入构造函数,因为它的执行太早了。Base
init()
Base()
任何想法如何绕过这个问题?我也很高兴看到Scala的解决方案。
更新:以下是工厂方法方法的通用版本:
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:这个问题基本上是“你如何为构造函数使用模板方法”?答案似乎是,“你可以,但这是一个坏主意”。所以我可以做一个模板工厂(模板方法+抽象工厂)。