2011-08-31 29 views
25

मैं इस के लिए चारों ओर देख रहा हूं, और इसकी सामान्य प्रतिक्रिया "वे असंबंधित हैं, और किसी के लिए प्रतिस्थापित नहीं की जा सकती" के आधार पर दिखाई देती है। लेकिन कहें कि आप एक साक्षात्कार में हैं और पूछें "आप विरासत के बजाय टेम्पलेट का उपयोग कब करेंगे और इसके विपरीत?"टेम्पलेट बनाम विरासत का उपयोग कब करें

+15

यह "असली सवाल नहीं" कैसे है? बंद-खुश ट्रिगर उंगलियां मुझे परेशान करती हैं। –

+2

यदि आप इस प्रश्न को साक्षात्कार में सुनते हैं, तो अलविदा कहने का समय है, क्योंकि वे सिर्फ अपना समय बर्बाद कर रहे हैं; और अब आप हमारे साथ ऐसा ही करते हैं। –

+1

यह एक गूंगा साक्षात्कार सवाल है। सबसे अच्छा, यह गलत तरीका है। आपको "उपकरण एक्स का उपयोग कब करते हैं" नहीं पूछना चाहिए। आपको पूछना चाहिए, "यहां समस्या है जे। आप इसे कैसे हल करते हैं?" और जवाब "टूल एक्स" हो सकता है। – tenfour

उत्तर

3

जब आप सुरक्षा को बनाए रखना चाहते हैं या वर्चुअल प्रेषण से बचना चाहते हैं तो आधार (या संरचना) में टेम्पलेट का उपयोग करें।

+2

वास्तव में, मुझे [सीआरटीपी] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) के माध्यम से आभासी प्रेषण से परहेज करने का संदेह है साक्षात्कारकर्ता क्या देख रहा था। – ildjarn

13

"सामान्य प्रतिक्रिया" गलत है। में "प्रभावी सी ++," स्कॉट Meyers मद 41 में कहते हैं:

मद 41: अंतर्निहित इंटरफेस को समझें और संकलन समय बहुरूपता।

मेयर्स संक्षेप में प्रस्तुत करने पर चला जाता है:

  • दोनों वर्गों और टेम्पलेट्स समर्थन इंटरफेस और बहुरूपता।
  • कक्षाओं के लिए, इंटरफ़ेस स्पष्ट हैं और फ़ंक्शन हस्ताक्षर पर केंद्रित हैं। पॉलीमोर्फिज्म आभासी कार्यों के माध्यम से रनटाइम पर होता है।
  • टेम्पलेट पैरामीटर के लिए, इंटरफेस अंतर्निहित हैं और मान्य अभिव्यक्तियों के आधार पर हैं। पॉलीमोर्फिज्म टेम्पलेट तत्काल और फ़ंक्शन ओवरलोडिंग रिज़ॉल्यूशन के माध्यम से संकलन के दौरान होता है।
+0

क्या वह टाइपो भी बनाता है? : पी –

+1

हे हे। मुझे कट और पेस्ट करने के लिए कोई स्रोत नहीं मिला ... – Gnawme

+0

मैं सभी को उस अध्याय को पढ़ने के लिए सलाह देता हूं, यह स्पष्ट होगा कि आपको परिचय से क्या उपयोग करने की आवश्यकता है :) – Hame

1

टेम्पलेट्स उचित जब एक अंतरफलक है कि असंबंधित वस्तुओं के कई प्रकार के पर काम करता है परिभाषित करने हैं। टेम्पलेट कंटेनर कक्षाओं के लिए सही अर्थ बनाते हैं जहां यह आवश्यक है कंटेनर में वस्तुओं को सामान्यीकृत करें, फिर भी प्रकार की जानकारी बनाए रखें।

विरासत के मामले में, सभी पैरामीटर परिभाषित पैरामीटर प्रकार का होना चाहिए, या इससे विस्तारित होना चाहिए। इसलिए जब ऑब्जेक्ट्स पर विधियों का संचालन होता है जो सही पदानुक्रमित संबंधों का सही ढंग से होता है, तो विरासत सबसे अच्छा विकल्प होता है।

जब विरासत गलत है लागू है, तो इसे असंबंधित वस्तुओं के अत्यधिक जटिल श्रेणी पदानुक्रमों की आवश्यकता होती है। कोड की जटिलता एक छोटे से लाभ के लिए बढ़ेगी। यदि यह मामला है, तो टेम्पलेट का उपयोग करें।

42

जिस तरह से मैं इसे देखता हूं वह है कि टेम्पलेट्स और विरासत सचमुच ऑर्थोगोनल अवधारणाएं हैं: विरासत "ऊर्ध्वाधर" है और अमूर्त से अधिक से अधिक ठोस तक नीचे जाती है। एक आकार, एक त्रिकोण, एक समतुल्य त्रिकोण।

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

विरासत रनटाइम अबास्ट्रक्शन प्रदान करता है। टेम्पलेट्स कोड जनरेशन उपकरण हैं।

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

+1

मुझे यह स्पष्टीकरण पसंद है। यह दूसरों की तुलना में सादे अंग्रेजी में थोड़ा और है। – Brent212

+1

हम्म, मैं इस मामले में एक विशेषज्ञ नहीं हूं और इसलिए मुझे यह जवाब मिला, लेकिन जैसा कि आप इसका वर्णन करते हैं, ऐसा लगता है कि टेम्पलेट्स जटिल परिसर प्रणाली के लिए सी ++ की कमी को हल करते हैं जैसे कि मिश्रण (एक समस्या, उदाहरण के लिए , गो द्वारा सुंदर ढंग से हल)। अगर इनट्स और युगल और स्ट्रिंग्स में कुछ भी सामान्य नहीं है लेकिन उन्हें सॉर्ट करने की आवश्यकता है, तो इन तीनों को किसी भी तरह से "क्रमबद्ध" विशेषता में विस्तारित किया जाना चाहिए। – pistacchio

+1

@pistacchio: मैं जटिल विरासत को "समाधान" नहीं कहूंगा। टेम्पलेट्स एक बहुत अच्छे तरीके से क्रमबद्धता प्रदान करते हैं, क्योंकि सॉर्टी को यह जानने की आवश्यकता नहीं है कि इसे सॉर्ट किया जा रहा है। कॉम्प्लेक्स विरासत आमतौर पर परिणाम देती है जब आप एक मजबूर मानसिकता के साथ काम करते हैं कि सबकुछ एक विरासत पदानुक्रम होना चाहिए, जो वास्तव में शायद ही उचित है। जाओ का दृष्टिकोण सरल है, लेकिन अधिक प्रतिबंधक और कम कुशल है। यह छोटी भाषा गो बनना चाहता है के लिए उपयुक्त है। –

0

टेम्पलेट एक एल्गोरिदम का वर्णन करता है जैसे वर्ग की दो वस्तुओं या उन्हें सॉर्ट करने के बीच तुलना का परिणाम तय करना। वस्तुओं के प्रकार (वर्ग) को अलग-अलग पर संचालित किया जा रहा है लेकिन ऑपरेशन या तर्क या चरण आदि तर्कसंगत रूप से वही है।

दूसरी तरफ विरासत बाल वर्ग द्वारा केवल माता-पिता की कार्यक्षमता को बढ़ाने या अधिक विशिष्ट बनाने के लिए उपयोग की जाती है। आशा है कि

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