निर्वासन के अनुरोध पर, मैं अपनी टिप्पणी का लंबे समय तक जवाब दे रहा हूं।
लोग जो सबसे बड़ी गलती करते हैं, वह यह मानता है कि इंटरफेस केवल खाली अमूर्त वर्ग हैं। एक इंटरफ़ेस प्रोग्रामर के लिए कहने का एक तरीका है, "मुझे परवाह नहीं है कि आप मुझे क्या देते हैं, जब तक कि यह इस सम्मेलन का अनुसरण करता है।"
.NET पुस्तकालय एक अद्भुत उदाहरण के रूप में कार्य करता है। उदाहरण के लिए, जब आप एक फ़ंक्शन लिखते हैं जो एक स्वीकार करता है IEnumerable<T>
, तो आप क्या कह रहे हैं, "मुझे परवाह नहीं है कि आप अपने डेटा को कैसे संग्रहीत कर रहे हैं। मैं सिर्फ यह जानना चाहता हूं कि मैं एक foreach
लूप का उपयोग कर सकता हूं ।
यह कुछ बहुत लचीले कोड की ओर जाता है। अचानक एकीकृत होने के लिए, आपको केवल मौजूदा इंटरफेस के नियमों द्वारा खेलना होगा। यदि इंटरफ़ेस को लागू करना मुश्किल या भ्रामक है, तो शायद यह एक संकेत है कि आप एक गोल छेद में एक वर्ग खूंटी को चमकाने की कोशिश कर रहे हैं।
लेकिन फिर सवाल उठता है: "कोड के पुन: उपयोग के बारे में क्या? मेरे सीएस प्रोफेसरों ने मुझे बताया कि विरासत सभी कोड के पुन: उपयोग की समस्याओं का समाधान था और यह विरासत आपको एक बार लिखने और हर जगह उपयोग करने की अनुमति देती है और यह अनाथों को बचाने की प्रक्रिया में मेनेंजाइटिस का इलाज करेगा। बढ़ते समुद्रों से और अधिक आँसू और पर और आदि आदि नहीं होंगे। "
वंशानुक्रम का उपयोग सिर्फ इसलिए कि आपको "कोड पुन: उपयोग करें" शब्दों की ध्वनि एक बहुत बुरा विचार है। गूगल द्वारा कोड स्टाइल गाइड इस बिंदु काफी संक्षेप में बनाता है:
वंशानुक्रम की तुलना में रचना अक्सर अधिक उपयुक्त होती है। ... [ख] एक उप-वर्ग को लागू करने वाले कोड को आधार और उप-वर्ग के बीच फैलाया जाता है, इसके कार्यान्वयन को समझना अधिक कठिन हो सकता है। उप-वर्ग उन कार्यों को ओवरराइड नहीं कर सकता है जो आभासी नहीं हैं, इसलिए उप-वर्ग कार्यान्वयन को बदल नहीं सकता है।
यह समझने के लिए कि उत्तराधिकार हमेशा उत्तर क्यों नहीं होता है, मैं MySpecialFileWriter Sp नामक एक वर्ग का उपयोग करने जा रहा हूं। एक व्यक्ति जो आँख बंद करके विश्वास करता है कि उत्तराधिकार सभी समस्याओं का समाधान है, यह तर्क देगा कि आपको विरासत के कोड से FileStream
नकल करने की कोशिश करनी चाहिए FileStream
। स्मार्ट लोग पहचानते हैं कि यह बेवकूफी है। आपको FileStream
अपनी कक्षा में (या तो स्थानीय या सदस्य चर के रूप में) एक वस्तु होनी चाहिए और इसकी कार्यक्षमता का उपयोग करना चाहिए।
FileStream
उदाहरण काल्पनिक लग सकता है, लेकिन यह नहीं है। यदि आपके पास दो कक्षाएं हैं जो दोनों एक ही इंटरफ़ेस को ठीक उसी तरह से लागू करते हैं, तो आपके पास एक तीसरा वर्ग होना चाहिए जो कि किसी भी ऑपरेशन को डुप्लिकेट करता है। आपका लक्ष्य उन वर्गों को लिखना चाहिए जो स्व-युक्त पुन: प्रयोज्य ब्लॉक हैं जिन्हें लेगो की तरह एक साथ रखा जा सकता है।
इसका मतलब यह नहीं है कि विरासत को हर कीमत पर बचा जाना चाहिए। विचार करने के लिए कई बिंदु हैं, और अधिकांश इस प्रश्न पर शोध करके कवर किया जाएगा, "संरचना बनाम वंशानुक्रम।" हमारे अपने स्वयं के ढेर अतिप्रवाह के विषय पर कुछ अच्छे उत्तर हैं।
दिन के अंत में, आपके सहकर्मी की भावनाओं में एक सूचित निर्णय लेने के लिए आवश्यक गहराई या समझ का अभाव होता है। विषय पर शोध करें और इसे अपने लिए समझें।
। जब वंशानुक्रम को दर्शाते हैं, तो हर कोई जानवरों का उपयोग करता है। वह बेकार है। विकास के 11 वर्षों में, मैंने कभी भी नाम नहीं लिखा है Cat
, इसलिए मैं इसे एक उदाहरण के रूप में उपयोग नहीं करने जा रहा हूं।
alligator
eat
भिन्नता का कार्यान्वयन , निश्चित रूप से, इसमें वह स्वीकार करता हैcat
औरdog
मापदंडों के रूप में।