類的構造函數運行後的方法比方說,我有一個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:這個問題基本上是「你如何使用模板方法構造函數」?答案似乎是,「你可以,但這是一個壞主意」。所以我可以做一個模板工廠(Template Method + Abstract Factory)。
如果init()在基類中是抽象的,那麼爲什麼每個派生類都必須調用它?如果他們不這樣會怎樣? – 2010-05-25 17:38:04
爲什麼不在'Base'類的構造函數中調用init()? – aioobe 2010-05-25 17:42:00
@Skip Head:他們不會被正確初始化。 – 2010-05-25 17:52:21