के निर्माता के बाद एक विधि चल रहा है मान लीजिए मैं एक जावा वर्गकिसी भी व्युत्पन्न वर्ग
abstract class Base {
abstract void init();
...
}
है और मुझे पता है कि हर व्युत्पन्न वर्ग init()
कॉल करने के लिए के बाद यह निर्माण किया है होगा। मैं, ज़ाहिर है, बस इसे व्युत्पन्न वर्ग 'कंस्ट्रक्टर्स में कह सकते हैं:
class Derived1 extends Base {
Derived1() {
...
init();
}
}
class Derived2 extends Base {
Derived2() {
...
init();
}
}
लेकिन यह टूटता नहीं बल्कि बुरी तरह सिद्धांत "अपने आप को दोहराने नहीं है" (और वहाँ Base
के कई उपवर्गों होने जा रहे हैं)। बेशक, init()
कॉल Base()
कन्स्ट्रक्टर में नहीं जा सकता है, क्योंकि इसे बहुत जल्दी निष्पादित किया जाएगा।
कोई भी विचार इस समस्या को कैसे बाधित करना है? मुझे स्कैला समाधान भी देखने में काफी खुशी होगी।
अद्यतन:
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: इस प्रश्न का मूल रूप से है "कैसे आप निर्माताओं के लिए टेम्पलेट विधि का उपयोग करते हैं" यहाँ फैक्टरी विधि दृष्टिकोण की एक सामान्य संस्करण है? और जवाब लगता है, "आप कर सकते हैं, लेकिन यह एक बुरा विचार है"। तो मैं इसके बजाय एक टेम्पलेट फैक्टरी (टेम्पलेट विधि + सार फैक्टरी) कर सकते हैं।
यदि init() आधार वर्ग में सार है, तो प्रत्येक व्युत्पन्न वर्ग को इसे क्यों कॉल करना पड़ता है? क्या होता है अगर वे नहीं करते? –
आप 'बेस' कक्षा के निर्माता में init() क्यों नहीं कहते हैं? – aioobe
@ स्किप हेड: वे ठीक से शुरू नहीं किए जाएंगे। –