2015-05-05 8 views
5

मेरे पास एक सारणी String foo() एक सारणी वर्ग में है जो पहले से ही कुछ प्रीकंप्यूशन करता है लेकिन अंतिम परिणाम को वापस करने के लिए विधि को वापस नहीं दे सकता है। तो मैं जो चाहता हूं वह यह है कि मेरे अमूर्त वर्ग से विरासत में प्राप्त प्रत्येक गैर-अमूर्त वर्ग को foo को इस तरह से कार्यान्वित करना है कि पहले super() को कॉल किया गया है और फिर परिणाम गणना की जाती है। जावा में इसे मजबूर करने का कोई तरीका है?गैर-अमूर्त विधि को ओवरराइड करने के लिए बल

+0

foo –

+1

हस्ताक्षर विधि से यह एक सार विधि है जो या तो अंतिम गणना या वापसी मान (रों) है कि यह जरूरत – MadProgrammer

उत्तर

15

हाँ, 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(); 
} 

मूल रूप से यदि आप एक विधि को ओवरराइड करने के उपवर्गों बाध्य करना चाहते हैं, यह सार होना जरूरी है - लेकिन यह है कि नहीं करता है ' टी को अन्य कोड द्वारा बुलाया जाने वाला तरीका होना चाहिए ...

+0

वहाँ कैसे दो तरीकों कॉल करने के लिए पर एक सम्मेलन है प्रदर्शन करने की जरूरत है फोन है साझा करें? मैं उन्हें वही नाम दूंगा (जो निश्चित रूप से संभव नहीं है) क्योंकि मूल रूप से वे वही काम करते हैं। –

+0

@ प्रिंसिपल-आदर्श-डोमेन क्या वे करते हैं? 'सार' विधि पूरी गणना का एक अलग हिस्सा बनाती है, इसलिए इसमें एक नाम होना चाहिए। एक ही नाम से बच्चे की कक्षा में अमूर्त विधि को कार्यान्वित करने के बारे में कुछ गलतफहमी हो सकती है। – Tom

+0

@ टॉम हाँ यह सच है। यह एक अलग हिस्सा करता है। लेकिन आमतौर पर मैं अपनी विधियों को वापस लौटता हूं जो वे वापस करते हैं और न कि वे क्या करते हैं। उदाहरण के लिए मेरे वर्तमान मामले में मैं सिर्फ विधि कॉल की संख्या गिनना चाहता हूं, इसलिए मेरा 'foo'' काउंटर ++ जैसा दिखता है; वापसी बार(); '। वैसे: क्या इसे लागू करने वाले वर्गों में अमूर्त विधि के कॉल को प्रतिबंधित करना संभव है? –

4

जावा में ऐसा करने का कोई तरीका नहीं है। हालांकि आप एक और विधि घोषित कर सकते हैं जो सार है और इसे कॉल करें। इस तरह:

public final String foo() { 
    String intermediate = ... // calculate intermediate result; 
    return calculateFinalResult(intermediate); 
} 

protected abstract String calculateFinalResult(String intermediate); 

इस तरह आप calculateFinalResult ओवरराइड करने के लिए मजबूर किया जाएगा। super उदाहरण की कोई कॉलिंग आवश्यक नहीं है। इसके अलावा उप-वर्ग आपके foo() को फिर से परिभाषित करने में सक्षम नहीं होंगे क्योंकि इसे final के रूप में घोषित किया गया है।

+1

बस एक नोट: संशोधक के उपयुक्त सॉर्टिंग का उपयोग करना एक अच्छा विचार है (उदा। 'संरक्षित' और 'सार')। आप यहां एक अनुशंसित सॉर्टिंग पा सकते हैं: https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.7-modifiers। – Tom

3

ऐसा कुछ?

public abstract class MyBean { 

    public final String foo(){ 
     String preFinalResult = [...]; 
     return doFinalResult(preFinalResult) 
    } 

    protected abstract String doFinalResult(String preFinal); 
} 
+1

'सार्वजनिक' से 'संरक्षित' से 'doFinalResult' के संशोधक को बदलने का अच्छा विचार हो सकता है, इसलिए अन्य वर्ग (बाल वर्ग और समान पैकेज में कक्षाओं को छोड़कर) इसे सीधे एक्सेस नहीं कर सकते हैं। – Tom

संबंधित मुद्दे