मान लीजिए मुझे कुछ कुछ BaseBuilder
का विस्तार करने की आवश्यकता है। बेस बिल्डर के पास foo
जैसी कुछ विधि है (जो BaseBuilder
लौटाती है)। व्युत्पन्न बिल्डर में विधि bar
है। विधि विधि foo
के बाद विधि लागू की जानी चाहिए। ताकि इसे करने के लिए मैं DerivedBuilder
इस तरह में foo
विधि ओवरराइड कर सकते हैं:जावा जेनेरिक बिल्डर
@Override
public DerivedBuilder foo() {
super.foo();
return this;
}
समस्या BaseBuilder
foo
तरह के तरीकों का एक बहुत है और मैं उनमें से हर एक ओवरराइड करने के लिए होता है। मुझे लगता है कि इसलिए मैं जेनरिक का उपयोग करने की कोशिश की करने के लिए नहीं करना चाहती:
public class BaseBuilder<T extends BaseBuilder> {
...
public T foo() {
...
return (T)this;
}
}
public class DerivedBuilder<T extends DerivedBuilder> extends BaseBuilder<T> {
public T bar() {
...
return (T)this;
}
}
लेकिन समस्या यह है कि मैं अभी भी नहीं लिख सकते हैं
new DerivedBuilder<DerivedBuilder>()
.foo()
.bar()
भी T
हालांकि यहां DerivedBuilder
है। बहुत सारे कार्यों को ओवरराइड न करने के लिए मैं क्या कर सकता हूं?
, आप कॉल कर सकते हैं: 'नई DerivedBuilder()। foo()। बार() '। यह पहले और फिर 'बार' काम करेगा और 'foo' निष्पादित करेगा। यदि आप 'बेसबिल्डर' के अधिक तरीकों को कॉल करना चाहते हैं और आखिरकार आप 'व्युत्पन्नबिल्डर' विधि को कॉल करना चाहते हैं, तो यह संभव नहीं है, क्योंकि दूसरी बार, विधि 'बेसबिल्डर' का संदर्भ देता है, इसके साथ आप 'व्युत्पन्न बिल्डर' नहीं कह सकते हैं। एस विधि –
@ संदीप.केआई ने इसे निष्पादित करने का प्रयास किया और संकलक शिकायत करता है कि 'बेस' को 'बेसबिल्डर' में परिभाषित नहीं किया गया था, क्योंकि तब मैं '.foo()। Bar() 'करता हूं' केवल एक ही चीज संकलक 'f' निष्पादित करने के बाद' टी 'के बारे में जानता है 'यह है कि यह' टी' 'बेसबिल्डर' – PepeHands
बढ़ाता है [यह] देखें (http://stackoverflow.com/questions/4217013/how-to-force-derived-class-to-call-super-method-like-android -does) और [यह] (http://stackoverflow.com/questions/6853638/require-override-of-method-to-call-super) और [यह] (http://stackoverflow.com/questions/6142460/how-do-i-force-a-polymorphic-call-to-the-super-method) ... – user1803551