मेरे पास एक सारणी String foo()
एक सारणी वर्ग में है जो पहले से ही कुछ प्रीकंप्यूशन करता है लेकिन अंतिम परिणाम को वापस करने के लिए विधि को वापस नहीं दे सकता है। तो मैं जो चाहता हूं वह यह है कि मेरे अमूर्त वर्ग से विरासत में प्राप्त प्रत्येक गैर-अमूर्त वर्ग को foo
को इस तरह से कार्यान्वित करना है कि पहले super()
को कॉल किया गया है और फिर परिणाम गणना की जाती है। जावा में इसे मजबूर करने का कोई तरीका है?गैर-अमूर्त विधि को ओवरराइड करने के लिए बल
उत्तर
हाँ, template method pattern उपयोग करने के लिए पुनः रचना और एक सार विधि को शामिल करके:
public abstract class AbstractSuper {
public final String foo() {
// Maybe do something before calling bar...
String initialResult = bar();
// Do something common, e.g. validation
return initialResult;
}
protected abstract String bar();
}
मूल रूप से यदि आप एक विधि को ओवरराइड करने के उपवर्गों बाध्य करना चाहते हैं, यह सार होना जरूरी है - लेकिन यह है कि नहीं करता है ' टी को अन्य कोड द्वारा बुलाया जाने वाला तरीका होना चाहिए ...
वहाँ कैसे दो तरीकों कॉल करने के लिए पर एक सम्मेलन है प्रदर्शन करने की जरूरत है फोन है साझा करें? मैं उन्हें वही नाम दूंगा (जो निश्चित रूप से संभव नहीं है) क्योंकि मूल रूप से वे वही काम करते हैं। –
@ प्रिंसिपल-आदर्श-डोमेन क्या वे करते हैं? 'सार' विधि पूरी गणना का एक अलग हिस्सा बनाती है, इसलिए इसमें एक नाम होना चाहिए। एक ही नाम से बच्चे की कक्षा में अमूर्त विधि को कार्यान्वित करने के बारे में कुछ गलतफहमी हो सकती है। – Tom
@ टॉम हाँ यह सच है। यह एक अलग हिस्सा करता है। लेकिन आमतौर पर मैं अपनी विधियों को वापस लौटता हूं जो वे वापस करते हैं और न कि वे क्या करते हैं। उदाहरण के लिए मेरे वर्तमान मामले में मैं सिर्फ विधि कॉल की संख्या गिनना चाहता हूं, इसलिए मेरा 'foo'' काउंटर ++ जैसा दिखता है; वापसी बार(); '। वैसे: क्या इसे लागू करने वाले वर्गों में अमूर्त विधि के कॉल को प्रतिबंधित करना संभव है? –
जावा में ऐसा करने का कोई तरीका नहीं है। हालांकि आप एक और विधि घोषित कर सकते हैं जो सार है और इसे कॉल करें। इस तरह:
public final String foo() {
String intermediate = ... // calculate intermediate result;
return calculateFinalResult(intermediate);
}
protected abstract String calculateFinalResult(String intermediate);
इस तरह आप calculateFinalResult
ओवरराइड करने के लिए मजबूर किया जाएगा। super
उदाहरण की कोई कॉलिंग आवश्यक नहीं है। इसके अलावा उप-वर्ग आपके foo()
को फिर से परिभाषित करने में सक्षम नहीं होंगे क्योंकि इसे final
के रूप में घोषित किया गया है।
बस एक नोट: संशोधक के उपयुक्त सॉर्टिंग का उपयोग करना एक अच्छा विचार है (उदा। 'संरक्षित' और 'सार')। आप यहां एक अनुशंसित सॉर्टिंग पा सकते हैं: https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.7-modifiers। – Tom
ऐसा कुछ?
public abstract class MyBean {
public final String foo(){
String preFinalResult = [...];
return doFinalResult(preFinalResult)
}
protected abstract String doFinalResult(String preFinal);
}
'सार्वजनिक' से 'संरक्षित' से 'doFinalResult' के संशोधक को बदलने का अच्छा विचार हो सकता है, इसलिए अन्य वर्ग (बाल वर्ग और समान पैकेज में कक्षाओं को छोड़कर) इसे सीधे एक्सेस नहीं कर सकते हैं। – Tom
- 1. मौजूदा एक्सटेंशन विधि को ओवरराइड करने के लिए कैसे करें
- 2. जावा में ओवरराइड होने के तरीके को कैसे बल दें?
- 3. GetHashCode() को ओवरराइड करने के लिए कब?
- 4. क्यों अंतिम रूप विधि ओवरराइड करने के लिए
- 5. फोर्स बच्चे कक्षाओं विधि ओवरराइड करने के लिए
- 6. बराबर विधि को ओवरराइड करना
- 7. कक्षा के उदाहरण के लिए एक विधि को ओवरराइड करें?
- 8. जावा विधि को ओवरराइड करना
- 9. एक अमूर्त कार्यान्वित विधि को कॉल करने के लिए सबक्लास को कैसे बल दें
- 10. संदेशबॉक्स को प्रोग्रामेटिक रूप से बंद करने के लिए बल
- 11. "कन्स्ट्रक्टर कॉल ओवरराइड करने योग्य विधि" को ठीक करने के लिए कैसे करें
- 12. निष्पादित करने के लिए एक IQueryable बल?
- 13. क्लास विधियों को ओवरराइड करने के लिए कैसे करें
- 14. एक्शनलिंक व्यवहार को ओवरराइड करने के लिए कैसे करें
- 15. आवेदन (आंतरिक ढांचे के बाहर) में आंतरिक ढांचे विधि को ओवरराइड करने के लिए कैसे करें
- 16. सभी सीएसएस नियमों को ओवरराइड करने के लिए हेड टैग के बहुत नीचे सीएसएस को प्रदर्शित करने के लिए wp_enqueue_style को कैसे बल दें?
- 17. रेल से ओवरराइड करने के लिए?
- 18. छवियों को कैश करने के लिए बल ब्राउज़र
- 19. ओवरराइड। टॉस्ट्रिंग विधि C#
- 20. सी ++ आभासी विधि ओवरराइड
- 21. जावा:। कैसे ओवरराइड विधि में सुपर कॉल करने के लिए() सुपर() (दादा-दादी विधि)
- 22. जेनेरिक विधि ओवरराइड स्विफ्ट
- 23. क्या मुझे ईवेंट को संभालने या बेस विधि को ओवरराइड करने के लिए एक नई विधि बनाना चाहिए?
- 24. Django - Model.create() विधि को ओवरराइड करना?
- 25. Django व्यवस्थापक: ओवरराइड विधि
- 26. निर्भरता को बदलने के लिए बल ब्राउज़र?
- 27. बल UICollectionView को रोकने के लिए दृश्य
- 28. एक सेटर विधि को ओवरराइड करना, और
- 29. django-rest-framework में डिफ़ॉल्ट निर्माण विधि को ओवरराइड करने के लिए कैसे करें
- 30. किसी श्रेणी का उपयोग करके किसी विधि को ओवरराइड करने के लिए
foo –
हस्ताक्षर विधि से यह एक सार विधि है जो या तो अंतिम गणना या वापसी मान (रों) है कि यह जरूरत – MadProgrammer