2015-01-11 6 views
11

में समान नाम वाले अमूर्त वर्ग में किसी अन्य विधि से कॉल विधि मेरे पास एक सारणी वर्ग और एक वर्ग है जो इसे विस्तारित करता है, मेरे पास दोनों वर्गों में एक ही नाम के साथ एक विधि है। मैं अमूर्त वर्ग की विधि को अमूर्त वर्ग की दूसरी विधि में कॉल करना चाहता हूं।वास्तविक वर्ग

Controller.java

public abstract class Controller { 

    public Result delete(Long id) { 
     return this.delete(id, true); 
    } 
    public Result delete(Long id, boolean useTransaction) { 
     // do something and return result 
    } 
} 

FileGroup.java

public class FileGroup extends Controller { 

    public Result delete(Long id, boolean central) { 
     // do something 
     return super.delete(id); 
    } 
} 

super.delete कॉल Controller.delete लेकिन this.delete(id, true)FileGroup में कॉल delete बजाय deleteController में जो पुनरावर्ती अनंत लूप के कारण और अतिप्रवाह ढेर है बुलाने की।

+0

@aioobe यह पूरी तरह से स्पष्ट नहीं है। ओपी ने 'super.delete (आईडी, केंद्रीय)' क्यों नहीं लिखा? ऐसा हो सकता है कि ओपी वास्तव में नियंत्रक में एक 'हटाना' विधि को कॉल करने के लिए 'फ़ाइल समूह' में 'हटाएं' चाहता है, जो बदले में अनंत नियंत्रक के बिना 'नियंत्रक' में दो तर्क 'हटाएं' को कॉल करता है। –

+0

* "ओपी ने सुपर.डिलीट (आईडी, सेंट्रल) क्यों नहीं लिखा?" * - क्योंकि यह एक व्यर्थ ओवरराइड होगा। * "[...] एक अनंत लूप के बिना।" * - हाँ, यही वह है जो मैं मानता हूं (और यही वह है जो मैं अपने उत्तर में संबोधित करता हूं)। – aioobe

+1

'// कुछ करें' की वजह से यह एक व्यर्थ ओवरराइड नहीं होगा। –

उत्तर

7

[...] लेकिन this.delete(id, true) कॉल के बजाय Controller में हटाने के बुलाने की FileGroup में हटा दें।

हां, सभी विधियां जावा में आभासी हैं, और इससे बचने का कोई तरीका नहीं है। आप फिर भी Controller में एक (गैर ओवरराइड) सहायक विधि बनाने के द्वारा इस के आसपास काम कर सकते हैं इस प्रकार है: यह आप Controller.delete प्रतिनिधि उपवर्ग के लिए कॉल से बचने में ऐसा करने से

public abstract class Controller { 

    private Result deleteHelper(Long id, boolean useTransaction) { 
     // do something and return result 
    } 

    public Result delete(Long id) { 
     return deleteHelper(id, true); 
    } 
    public Result delete(Long id, boolean useTransaction) { 
     return deleteHelper(id, useTransaction); 
    } 
} 

+0

उत्तर के लिए धन्यवाद मैं आपसे सहमत हूं, लेकिन वर्तमान वर्ग का उल्लेख करने के लिए 'इस' की तरह कुछ भी है, अगर यह स्थैतिक था तो मैं केवल नियंत्रक :: हटा सकता हूं (आईडी, सत्य) –

+1

नहीं। आपको इस तरह के कामकाज करना है। – aioobe

3

यह पूरी तरह से स्पष्ट नहीं है कि आपका प्रश्न क्या है। आपके सवाल का एक तर्क delete विधि बनाने के लिए कैसे है

public class FileGroup extends Controller { 

    public Result delete(Long id, boolean central) { 
     // do something 
     return super.delete(id, true); 
    } 
} 

: तुम सिर्फ एक ढेर अतिप्रवाह पैदा करने के बिना Controller में FileGroup कॉल विधि delete(id, true) में विधि delete बनाने की कोशिश कर रहे हैं, तो आप सिर्फ यह कर सकते हैं Controller में में संस्करण के बजाए Controller में दो-तर्क delete विधि को कॉल करें, उत्तर यह है कि आपको @ एओओब के सहायक विधि समाधान का उपयोग करना चाहिए।

+0

उत्तर के लिए धन्यवाद, यह मेरी समस्या का समाधान करेगा, लेकिन मैं वास्तव में जानना चाहता हूं कि वर्तमान वर्ग का उल्लेख करने के लिए 'इस' की तरह कुछ भी है, अगर यह स्थैतिक था तो मैं केवल नियंत्रक :: हटा सकता हूं (आईडी, सत्य) –

+1

@ मोहनसेहेरी नहीं 'इस' वर्ग में एक इंस्टेंस विधि का आह्वान करने और इसके बजाय उप-वर्गों में संस्करणों को निष्पादित करने से रोकने का तरीका। वैसे भी सुविधा व्यर्थ होगा। जैसा कि आप वर्तमान वर्ग के नियंत्रण में परिभाषा के अनुसार हैं, आप हमेशा एयोब के समाधान का उपयोग कर सकते हैं - इसके बजाय इस वर्ग से एक निजी (या अंतिम) विधि को कॉल करें। –

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