2013-04-16 7 views
6

मेरे पास पहले से ही यह कामकाजी पदानुक्रम है और कार्यक्रम अपेक्षित के रूप में चलता है। असल में मैंने बेस क्लास में सब कुछ समझाया है और अन्य सभी सबक्लास अपने तरीके जोड़ रहे हैं।लागू डिजाइन पैटर्न

abstract Class Base{ 
} 

class A extends Base{ 
    //new methods 
} 

class B extends Base{ 
    //new methods 
} 

सब कुछ बाद में जब तक अच्छा लग रहा है (errr ... नई आवश्यकताओं) मुझे लगता है मैं एक नया वर्ग के लिए (की सुविधा देता है इस वर्ग सी कहते हैं) की जरूरत महसूस करते हैं कि, अब दोनों वर्ग ए और बी का विस्तार जावा में अपनी दो ठोस वर्ग का विस्तार संभव नहीं है।

class C extends A, B{ 
    //new methods 
} 

मुझे कक्षा ए और कक्षा बी में दोनों विधियों और चर की आवश्यकता है, लेकिन मुझे नहीं पता कि यह कैसे करें? मैं इस परिवर्तन को कैसे कर सकता हूं इस पर कोई संकेत? मैं डिजाइन पैटर्न में इतना अच्छा नहीं हूं इसलिए मैंने इसे यहां पूछने के बारे में सोचा।

धन्यवाद

अद्यतन यह वास्तव में एक JSF प्रबंधित बीन जिसमें मैं एक बेस प्रबंधित बीन और अन्य सभी उपवर्ग अधिभावी में सब कुछ निकाला है/आधार के शीर्ष पर अपने स्वयं के कार्यान्वयन जोड़ने सेम में कामयाब रहे। बस एक नया आवश्यकता है कि जिसमें मैं (सी)

+0

कक्षाओं के बारे में अधिक जानकारी के बिना कहना मुश्किल है, लेकिन ऐसा लगता है कि आप एक घटक आधारित डिजाइन के साथ बेहतर होंगे। –

+6

आपको विधियों की आवश्यकता है, लेकिन क्या संबंध 'सी ए और बी' आवश्यक है? आप रचना का उपयोग कर सकते हैं, लेकिन यह जानने के लिए कि क्या यह उचित है, आपकी पोस्ट को अधिक जानकारी चाहिए। –

+1

ये संरचना पर विचार करते हैं और 'सी' में 'ए' और' बी' के उदाहरण होते हैं। –

उत्तर

4

एक नया उपवर्ग में दोनों उपवर्गों (ए और बी) की कार्यक्षमता आवश्यकता के अनुरूप अपने कोड refactor और बनाने के लिए जोड़ा गया था नहीं है A और B और Base बजाय वर्गों और उपयोग की इंटरफेस कार्यान्वयन विरासत के बजाय इंटरफ़ेस विरासत।
तो फिर तुम दोनों A और B (यह कैसे एकाधिक वंशानुक्रम Java में समर्थित है है)

+1

प्रश्न में @ मार्क एस्ट्राडा ने उल्लेख किया है "मुझे कक्षा ए और कक्षा बी में दोनों विधियों और चर की आवश्यकता है" तो, मुझे लगता है कि वह 'ए' और 'बी' को इंटरफेस में बदल नहीं सकता क्योंकि उनके पास सदस्य चर हैं। – codeMan

+0

@codeMan: सदस्य चर कोई समस्या नहीं है। उसे बस अपने कोड को ठीक से फिर से डिजाइन करने की जरूरत है। – Cratylus

+1

और उसे मौजूदा कोड का उपयोग करने के बजाय सभी विधियों को फिर से लागू करना होगा। –

3

या तो उपयोग संरचना लागू करने या भीतरी वर्ग का उपयोग कर सकते हैं।

class C extends A { 
    B b = ... // this is one option 

    class D extends B { 
    // this is another option 
    } 
} 
2

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

दूसरा समाधान कक्षा सी (संरचना) में प्रकार ए या/और बी का उदाहरण बनाना है।

Class C{ 
A a=new A(); 
B b=new B(); 
} 

तुम भी एक विस्तार और बी के कहने बनाने

1

चलें CA और B शामिल लेकिन यह भी यह extend Base बनाने के तो प्रतिनिधि तुम नहीं की तरह दोनों विरासत और रचना का उपयोग कर एक मिश्रित दृष्टिकोण का उपयोग कर सकते हैं कुछ भी डुप्लिकेट करना है।

class C extends Base 
{ 
    A a = new A(); 
    B b = new B(); 

    // Now delegate any implemented methods from Base to A and B 

    @Override 
    public void anAbstractMethod() 
    { 
     a.anAbstractMethod(); 
     b.anAbstractMethod(); 
    } 
} 
संबंधित मुद्दे