2009-05-07 13 views
37

क्या कोई व्यक्ति कृपया बता सकता है कि मैं विरासत के बजाय प्रतिनिधिमंडल का उपयोग कब करना चाहूंगा?विरासत के बजाय प्रतिनिधिमंडल का उपयोग कब करें?

+5

यहां अच्छी चर्चा: http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –

+1

मैं दिए गए उत्तरों पर विस्तार नहीं करूंगा, हालांकि एक पुस्तक जिसे मैंने वास्तव में इस तरह के साथ उपयोगी पाया है ओओ डिजाइन के मुद्दे आर्थर रील की उत्कृष्ट पुस्तक ** ऑब्जेक्ट ओरिएंटेड डिजाइन हेरिस्टिक ** है। http://www.davegardner.me.uk/reading/oo-design-heuristics/ http://www.amazon.co.uk/Object-oriented- डिज़ाइन- ह्यूरिस्टिक्स- आर्थर-Riel/dp/020163385X – Dave

उत्तर

46

जब आप बेस क्लास 'एपीआई "को कॉपी/एक्सपोज़ करना चाहते हैं, तो आप विरासत का उपयोग करते हैं। जब आप केवल "कॉपी" कार्यक्षमता चाहते हैं, प्रतिनिधिमंडल का उपयोग करें।

इसका एक उदाहरण: आप किसी सूची से बाहर निकलना चाहते हैं। ढेर में केवल पॉप, पुश और पिक है। आपको विरासत का उपयोग नहीं करना चाहिए कि आप push_back, push_front, removeAt, et al.-Stack में कार्यक्षमता की तरह नहीं चाहते हैं।

+2

अच्छा नियम अंगूठे का –

24

उनके पास एक-दूसरे के साथ कुछ लेना देना नहीं है। प्रतिनिधि एक व्यवहार है। विरासत एक आदर्श तकनीक है।

विरासत "is-a" मॉडलिंग के लिए है। एक कंप्यूटर "एक-एक" इलेक्ट्रॉनिक प्रणाली है।

प्रतिनिधिमंडल यह है कि तरीके कैसे परिणाम प्रदान करते हैं। कभी-कभी एक वस्तु किसी अन्य वस्तु को काम सौंपती है। प्रतिनिधि किसी भी रिश्ते के माध्यम से हो सकता है - आप एक समग्र या कुल, या किसी भी रिश्तेदार के सदस्य को सुपरक्लस में भेज सकते हैं।

+3

विरासत "is-a" रिश्तों को मॉडलिंग के लिए है, लेकिन यह भी है कि उप वर्ग बेस क्लास की कार्यक्षमता बढ़ाती है और इसे प्रतिबंधित करने के लिए कुछ भी नहीं करती है। – ChadD

+0

@ चाडवर्थिंगटन: सच नहीं है; एक उप-वर्ग विधियों को ओवरराइड कर सकता है और उन्हें प्रतिस्थापित कर सकता है - अनिवार्य रूप से एक प्रतिबंध - सुपरक्लास पर वापस दिए बिना। –

+1

@ एस।लॉट: जबकि आप विधियों को ओवरराइड कर सकते हैं, आपको उन सभी विधियों को ओवरराइड करने के लिए सावधान रहना होगा जो उस व्यवहार को बेनकाब करते हैं, जिसे आप प्रतिबंधित करना चाहते हैं - जिनमें से कुछ अभी तक लिखे गए नहीं हैं। @ चाडवर्थिंगटन की सलाह सुरक्षित है, खासकर जब आप सुपरक्लास को नियंत्रित नहीं करते हैं। –

4

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

3

मान लीजिए आपका वर्ग बी कहा जाता है और व्युत्पन्न/को प्रत्यायोजित वर्ग कहा जाता है एक तो

यहाँ कुछ उदाहरण हैं जब विरासत या प्रतिनिधिमंडल इस्तेमाल किया जा रहा हैं:
तो

  • आप व्यक्त करना चाहता हूँ रिलेशनशिप (ए-ए) तो आप विरासत का उपयोग करना चाहते हैं।
  • आप अपनी कक्षा को मौजूदा एपीआई को उम्मीद करने में सक्षम होना चाहते हैं, तो आपको विरासत का उपयोग करने की आवश्यकता है।
  • आप ए को बढ़ाने के लिए चाहते हैं, लेकिन ए अंतिम है और इसे आगे बढ़ाया नहीं जा सकता है तो आपको संरचना और प्रतिनिधिमंडल का उपयोग करने की आवश्यकता है।
1

मेरी राय में, जब प्रतिनिधि का उपयोग करने का समय होता है और विरासत कभी भी एम्बेडेड होती है तो प्रतिनिधिमंडल को बुलाया जा सकता है।

उदाहरण के लिए the in_threads gem लें, यह किसी भी रूबी एन्यूमेबल मॉड्यूल के लिए थ्रेड को लागू करने के लिए इनट्रेड्स प्रतिनिधिमंडल का उपयोग करता है। इसके साथ, केवल सरणी पर in_threads विधियों को कॉल करें, यह थ्रेड में चलाएगा।

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