2009-10-26 18 views
10

मेरे पास कक्षा ए है और एक उप-वर्ग बी लिखता है। ए में केवल एक कन्स्ट्रक्टर है जिसे पैरामीटर किया गया है। बी को ए के इस सुपर कन्स्ट्रक्टर को कॉल करना है, अब मैं एक ऑब्जेक्ट को पैरामीटर के रूप में उपयोग करना चाहता हूं। इस ऑब्जेक्ट को बी की विधि को कॉल करना चाहिए, इसलिए पैरामीटर-ऑब्जेक्ट को बी का संदर्भ रखना होगा या आंतरिक श्रेणी होना चाहिए।सुपर कन्स्ट्रक्टर का आह्वान करते समय "यह" का जिक्र करते हुए?

public B(){ 
    super.(new parameter(this)) 
} 

अब जब मैं निर्माता आह्वान करने के लिए की तरह चाहते हैं ... ग्रहण कहते हैं:

'इस' और न ही 'सुपर' का उल्लेख नहीं किया जा सकता है, जबकि स्पष्ट रूप से एक निर्माता

लागू केवल एक चीज जिसे मैं इस के आसपास पाने के लिए देखता हूं, पैरामीटर ऑब्जेक्ट में "यह" - इंजेक्शन इंजेक्ट करने के लिए एक सेट-विधि है। मैं सुपर-क्लास को संपादित नहीं करना चाहता हूं।

क्या आप इसके आसपास कोई बेहतर तरीका देखते हैं।

+0

क्या * भाषा * आप किस बारे में बात कर रहे हैं? –

+11

टैग जोनाथन को देखें ... इसका जावा – craftsman

उत्तर

17

कंपाइलर वास्तव में आपको पैर में खुद को शूटिंग से रोक रहा है। बी सुपर कन्स्ट्रक्टर को कॉल करने के बाद पूरी तरह से निर्मित नहीं किया गया है, इसलिए यदि आप इसे संदर्भित करते हैं (यदि संकलक इसे संदर्भित करता है), और यह बी पर एक विधि को कॉल करता है, बी एक अमान्य स्थिति में होगा और सभी प्रकार का कारण बनता है बदसूरत समस्याओं का (वास्तव में, ए अभी भी शुरू नहीं हुआ है, न ही वस्तु सहित किसी भी वर्ग को श्रृंखला)।

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

+0

मुझे पता है कि इसे कैसे हल किया जाए। असली समस्या यह है कि सुपर क्लास "पुराना" कोड है। मैं इसे थोड़ा अलग संदर्भ में पुन: उपयोग कर रहा हूं। मैं एक सुरुचिपूर्ण समाधान की तलाश में था। लेकिन मुझे लगता है कि नहीं है। पुराने कोड का पुन: उपयोग करने की कीमत है। –

+2

आप इसे पुराने संस्करण के चारों ओर एक रैपर के रूप में रखकर, इसे लिख सकते हैं। क्या पुरानी कक्षा एक इंटरफेस को कार्यान्वित करती है जिसे आप अपनी नई वस्तु के साथ कार्यान्वित कर सकते हैं? – Joe

+1

@ c0d3x, आप अपना समाधान पोस्ट कर सकते हैं (एक अलग प्रश्न में) और पूछें कि क्या एक और अधिक सुरुचिपूर्ण समाधान है। आपका समाधान देखने से संबंधित विशिष्ट मामले के बारे में बहुत सारे प्रश्नों का उत्तर दिया जाएगा। – Yishai

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