2012-04-02 15 views
5

से विरासत में मिली मूल रूप से, मेरे पास है:जावा उपवर्ग: कई निर्माताओं सार सुपर क्लास

public abstract class AbstractClass { 
    public AbstractClass(Type arg0, Type arg1, Type arg2) { 
     // do some stuff with all those args 
    } 

    public AbstractClass(Type onlyOneArg) { 
     // do different stuffs with this different arg. 
    } 

    protected someMethods() { /* ... */ } 
} 

और मैं उपवर्गों में कुछ समस्या है:

  • पहले, मैं के सबसे -इन करने के लिए है मामलों- बेकार ढंग से रचनाकारों को फिर से लिखना। बहुत परेशान नहीं, आंखों के लिए थोड़ा गंदा है।
  • और, अधिक महत्वपूर्ण, मुझे दोनों रचनाकारों को लागू करने के लिए मजबूर नहीं किया गया है (हालांकि दोनों प्रोग्राम में उपयोग किए जाते हैं)। मेरे वर्तमान उपवर्गों की

उदाहरण:

public class MyClass extends AbstractClass { 
    public MyClass(Type arg0, Type arg1, Type arg2) { 
     super(arg0, arg1, arg2); 
    } 

    public MyClass(Type onlyOneArg) { 
     super(onlyOneArg); 
    } 
} 

और

  • मैं एक उपवर्ग के निर्माता में कुछ विशेष कोड लिखने के लिए अगर मैं चाहता हूँ में सक्षम होना चाहिए।
  • मेरे पास बहुत सारे साझा कोड हैं जिन्हें मैं अमूर्त वर्ग में रखना चाहता हूं।

क्या मैं इसके बारे में कुछ कर सकता हूं? क्या जावा के बारे में मुझे कुछ पता नहीं है? या मेरा डिजाइन खराब है? या ..

+1

सुनिश्चित नहीं है कि सवाल क्या है। क्या आप सभी सुपरक्लास रचनाकारों को लागू करने के लिए मजबूर होना चाहते हैं? आपके द्वारा बताई गई आवश्यकताओं के बारे में क्या है कि आप ऐसा नहीं कर सकते हैं? –

+0

मुझे प्रश्न को सुधारने में खुशी होगी लेकिन मुझे पूरा यकीन नहीं है .. मेरा मतलब था कि मैं यह सुनिश्चित करना चाहता हूं कि प्रत्येक 'सार क्लास के उप-वर्ग में, दोनों निर्माता उपलब्ध हैं। कार्यक्रम में, मैं सटीक प्रकार के बिना दोनों रचनाकारों के साथ तत्काल हूं।मुझे केवल इतना पता है कि ऑब्जेक्ट एक 'सार क्लास' उपclass होगा। इसलिए मुझे यह सुनिश्चित करना होगा कि मैं हमेशा दोनों रचनाकारों का उपयोग कर सकूं। क्या यह और समझ में आता है? ... सूखी, अंग्रेजी में मेरे विचार व्यक्त करना मुश्किल है! – user978548

+0

इसके अलावा, मैं यह भी सोच रहा था कि अगर जावा को स्वचालित रूप से 'सार क्लास' कन्स्ट्रक्टर का उपयोग करने के लिए संभव है, तो यह सबक्लास में परिभाषित नहीं है, लेकिन यह मेरी मुख्य चिंता नहीं है। – user978548

उत्तर

1

उप-वर्ग को पर कॉल करना होगा (या दोनों, यदि आप अपने उदाहरण में दोनों को फिर से परिभाषित करते हैं) सुपरक्लास रचनाकारों के; लेकिन आप superclass के समान हस्ताक्षर के साथ रचनाकारों को फिर से परिभाषित करने के लिए मजबूर नहीं कर सकते हैं।

गारंटी नहीं है कि एक सुपर क्लास निर्माता है एक ही रास्ता बुलाया सुपर क्लास में केवल एक निर्माता है।

मुझे लगता है कि आपको अपने सुपरक्लास (शायद 2 कक्षाएं बनाना) को फिर से डिजाइन करने के तरीके के बारे में सोचना चाहिए यदि आप इसे हमेशा पर कॉल करना चाहते हैं।

लेकिन, यदि एक उप-वर्ग में एक विशिष्ट निर्माता बनना चाहते हैं, तो आपको कारखाने में "निर्माण" चिंता को अलग करना चाहिए; जहां आप अपने प्रत्येक उप-वर्ग के लिए विशेष फैक्ट्री कक्षाएं ले सकते हैं। आपके कारखानों इस इंटरफेस को लागू करेंगे:

interface AbstractClassFactory { 
    AbstractClass create(Type arg0, Type arg1, Type arg2); 
    AbstractClass create(Type onlyOneArg); 
} 
+0

बस थोड़ा सा सवाल: मैंने अभी ग्रहण में परीक्षण किया और देखा कि मैं अमूर्त वर्ग में घोंसले फैक्ट्री इंटरफ़ेस को रख सकता हूं, और प्रत्येक उप-वर्ग कारखाना बिना किसी समस्या के अपने संबंधित वर्ग में नेस्टेड क्लास के रूप में घोंसला लगा सकता है। क्या यह एक बुरा अभ्यास है? – user978548

+0

@ user978548: जरूरी नहीं, यह आपके उपयोगकर्ताओं को भ्रमित कर सकता है। साथ ही, आपके नेस्टेड फैक्ट्री इंटरफ़ेस और कक्षाएं ['स्थिर '] होनी चाहिए (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)। –

0

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

+0

मैं प्रतिबिंब का उपयोग कर रहा हूं, लेकिन विभिन्न कन्स्ट्रक्टर की आवश्यकता अंत उपयोगकर्ता उपयोग से संबंधित है। लेकिन मैं रचनाकारों के बजाय कारखाने का उपयोग करूंगा। – user978548

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