दिलचस्प पोस्ट
जहां MySQL स्टोर डेटाबेस फ़ाइलों को करता है? मैं WCF सेवा से साफ JSON कैसे वापस कर सकता हूं? UILabel – पाठ और लिंक के रूप में स्ट्रिंग नेक्सस 4 पर यूएसबी डिबगिंग मोड को कैसे ढूंढें और चालू करें लक्ष्य निर्भरता के लिए एक्सकोडबिल्ड अलग प्रावधान प्रोफाइल आप एसक्यूएल सर्वर में हां / नो बूलियन फ़ील्ड कैसे बनाते हैं? कैसे iPhone 5 के लिए अलग स्टोरीबोर्ड पर स्विच करने के लिए? एक लिंक पर jQuery / JavaScript में एक क्लिक का अनुकरण करना मैं Python C ++ एक्सटेंशन के साथ valgrind का उपयोग कैसे कर सकता हूं? दो अंकों के बीच की दूरी की गणना कैसे एसक्यूएल सर्वर में शब्द समारोह में संख्या लिखने के लिए संपत्ति पथ में सभी चरणों का पता लगाना TextView में पूर्णांक मान JavaScript ऑब्जेक्ट में कन्स्ट्रक्टर्स एक काल्पनिक क्षेत्र के चारों ओर वस्तु को देखकर SCNCamera नोड को घुमाएं

मुझे C ++ में एकाधिक विरासत से क्यों बचाना चाहिए?

क्या यह एकाधिक विरासत का उपयोग करने के लिए एक अच्छी अवधारणा है या मैं इसके बजाय अन्य चीजें कर सकता हूं?

Solutions Collecting From Web of "मुझे C ++ में एकाधिक विरासत से क्यों बचाना चाहिए?"

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

सारांश

  1. विरासत के बजाय सुविधाओं की रचना पर विचार करें
  2. खतरे के डायमंड से सावधान रहें
  3. ऑब्जेक्ट के बजाय कई इंटरफेस का भाग लें
  4. कभी-कभी, एकाधिक वंशानुक्रम सही बात है यदि ऐसा है, तो इसका उपयोग करें।
  5. कोड समीक्षा में अपने बहु-विरासत वास्तुकला की रक्षा के लिए तैयार रहें

1. शायद रचना?

यह विरासत के लिए सच है, और इसलिए, यह कई विरासत के लिए और भी सच है

क्या आपकी वस्तु वास्तव में किसी दूसरे से उत्तीर्ण होने की आवश्यकता है? एक Car को Engine से काम करने के लिए, न ही Wheel से वारिस करने की आवश्यकता नहीं है एक Car में एक Engine और चार Wheel

यदि आप संयोजन के बजाय इन समस्याओं को हल करने के लिए एकाधिक विरासत का उपयोग करते हैं, तो आपने कुछ गलत किया है।

2. ड्रेन्ड ऑफ़ ड्रेड

सामान्यतया, आपके पास एक कक्षा A , फिर B और C दोनों A । और (मुझसे मत पूछिए) क्यों किसी ने फैसला किया है कि D को B और C दोनों से प्राप्त करना चाहिए।

मैंने इस तरह की समस्या को 8 आठ सालों में दो बार सामना किया है, और यह देखने के लिए मनोरंजक है:

  1. यह शुरुआत से कितनी गलती थी (दोनों ही मामलों में, D को B और C दोनों से विरासत में नहीं लिया जाना चाहिए), क्योंकि यह खराब वास्तुकला थी (वास्तव में, C बिल्कुल अस्तित्व में नहीं होना चाहिए …)
  2. कितने रखरखाव इसके लिए भुगतान कर रहे थे, क्योंकि सी ++ में, अभिभावक वर्ग A अपने पोते-वर्ग D में दो बार मौजूद था, और इस प्रकार, एक अभिभावक फ़ील्ड A::field अद्यतन करना या तो इसे दो बार ( B::field और C::field माध्यम से अपडेट करना) C::field ), या कुछ चुपचाप गलत और दुर्घटना के बाद, बाद में ( B::field में एक नया सूचक, और हटाएं C::field …)

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

ऑब्जेक्ट पदानुक्रम में, आपको पदानुक्रम को पेड़ के रूप में रखने की कोशिश करनी चाहिए (एक नोड के पास एक माता पिता है), ग्राफ के रूप में नहीं।

डायमंड के बारे में अधिक (2017-05-03 को संपादित करें)

सी ++ में ड्रैम ऑफ ड्रेड के साथ असली समस्या ( डिजाइन संभालने वाला ध्वनि है – आपके कोड की समीक्षा की गई है! ), यह है कि आपको एक विकल्प बनाने की आवश्यकता है :

  • क्या क्लास A लिए आपके लेआउट में दो बार मौजूद है और इसका क्या अर्थ है? यदि हां, तो हर तरह से इसे से दो बार दोहन
  • यदि यह केवल एक बार मौजूद हो, तो उसके पास वस्तुतः से वारिस हो।

यह विकल्प समस्या के निहित है, और सी ++ में, अन्य भाषाओं के विपरीत, आप वास्तव में यह बिना किसी विशिष्ट भाषा के स्तर पर अपने डिजाइन को मजबूती के लिए कर सकते हैं।

लेकिन सभी शक्तियों की तरह, उस शक्ति के साथ जिम्मेदारी आती है: अपने डिजाइन की समीक्षा करें।

3. इंटरफेस

शून्य या एक कंक्रीट कक्षाओं के एकाधिक उत्तराधिकार, और शून्य या अधिक इंटरफेस आमतौर पर ठीक है, क्योंकि आपको ऊपर वर्णित ड्रेन्ड के डैम का सामना नहीं किया जाएगा। वास्तव में, यह है कि जावा में चीजों को कैसे किया जाता है

आम तौर पर, आप का क्या मतलब है जब सी A और B से निकलते हैं तो यह है कि उपयोगकर्ता C उपयोग कर सकते हैं जैसे कि वह A , और / या जैसे यह B था।

सी ++ में, एक अंतरफलक एक अमूर्त वर्ग है जिसमें:

  1. इसकी सभी पद्धति शुद्ध आभासी (= 0 suffixed) की घोषणा की (2017-05-03 को हटा दिया गया)
  2. कोई भी सदस्य चर

शून्य के एकाधिक भाग एक वास्तविक वस्तु के लिए, और शून्य या अधिक इंटरफेस को "बदबूदार" नहीं माना जाता है (कम से कम उतना नहीं)।

सी + + एब्सट्रेट इंटरफेस के बारे में और अधिक (2017-05-03 को संपादित करें)

सबसे पहले, एनवीआई पैटर्न का उपयोग एक अंतरफलक बनाने के लिए किया जा सकता है, क्योंकि वास्तविक मापदंड को कोई राज्य नहीं है (अर्थात this अलावा कोई सदस्य चर नहीं)। आपका सार इंटरफ़ेस का बिंदु एक अनुबंध प्रकाशित करना है ("आप मुझे इस तरह से कॉल कर सकते हैं, और इस तरह से"), कुछ और नहीं, कुछ भी कम नहीं। केवल सार वर्चुअल विधि होने की सीमा एक डिजाइन विकल्प होना चाहिए, दायित्व नहीं।

दूसरा, सी ++ में, यह वास्तव में सार इंटरफेस से, (यहां तक ​​कि अतिरिक्त लागत / अविवेकी के साथ) के उत्तराधिकार के लिए मायने रखता है। यदि आप नहीं करते हैं, और इंटरफ़ेस विरासत आपके पदानुक्रम में कई बार प्रकट होता है, तो आपके पास अस्पष्टता होनी चाहिए।

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

4. क्या आपको वास्तव में एकाधिक वंशानुक्रम की आवश्यकता है?

कभी कभी हाँ।

आमतौर पर, आपकी C क्लास A और B से विरासत में मिली है, और A और B दो असंबंधित ऑब्जेक्ट हैं (यानी एक ही पदानुक्रम में, सामान्य, अलग-अलग अवधारणाओं आदि) में नहीं।

उदाहरण के लिए, आपके पास X, Y, Z निर्देशांकों के साथ Nodes की एक प्रणाली हो सकती है, जो बहुत सारे ज्यामितीय गणनाओं (शायद एक बिंदु, ज्यामितीय ऑब्जेक्ट का हिस्सा) करने में सक्षम है और प्रत्येक नोड एक स्वचालित एजेंट है, जो अन्य एजेंटों के साथ संवाद करने में सक्षम है ।

शायद आपके पास पहले से ही दो पुस्तकालयों तक पहुंच हो, प्रत्येक अपनी खुद की नाम स्थान (नामों का उपयोग करने का दूसरा कारण … लेकिन आप नामस्थान का उपयोग करते हैं, है ना?), एक geo और दूसरा वाला

तो आपके पास अपना स्वयं own::Node ai::Agent और geo::Point से दोनों मिलता है।

यह वह पल है, जब आपको अपने आप से पूछना चाहिए कि आपको इसके बजाय संरचना का उपयोग नहीं करना चाहिए। यदि own::Node वास्तव में वास्तव में दोनों ai::Agent और एक geo::Point , तो रचना नहीं करेंगे।

इसके बाद आपको कई स्वयंसेवाओं की ज़रूरत होगी, जिसमें आपका own::Node 3 डी स्पेस में अपनी स्थिति के अनुसार अन्य एजेंटों के साथ संवाद करेंगे।

(आप ध्यान दें कि ai::Agent और geo::Point पूरी तरह से, पूरी तरह से, पूरी तरह से अनारक्षित हैं … यह बहुत अधिक से अधिक वंशानुक्रम के खतरे को कम कर देता है)

अन्य मामले (2017-05-03 को संपादित करें)

अन्य मामलों में भी हैं:

  • कार्यान्वयन विवरण के रूप में (उम्मीद है कि निजी) विरासत का उपयोग करना
  • नीतियों जैसे कुछ सी + + मुहावरों को बहु-विरासत का इस्तेमाल किया जा सकता है (जब प्रत्येक भाग को this माध्यम से दूसरों के साथ संवाद करने की आवश्यकता होती है)
  • std :: exception ( वर्चुअल विरासत अपवाद के लिए आवश्यक है? ) से आभासी विरासत
  • आदि।

कभी-कभी आप संरचना का उपयोग कर सकते हैं, और कभी-कभी एमआई बेहतर होता है मुद्दा यह है: आपके पास एक विकल्प है यह जिम्मेदारी से करें (और आपके कोड की समीक्षा की गई)

5. तो, क्या मुझे एक से अधिक वंशानुक्रम करना चाहिए?

ज्यादातर समय, मेरे अनुभव में, नहीं एमआई सही उपकरण नहीं है, भले ही यह काम करने लगता है, क्योंकि यह आलसी द्वारा परिणामों को बिना बिना ढेर सुविधाओं के इस्तेमाल के लिए इस्तेमाल किया जा सकता है (जैसे कि Car Engine और Wheel दोनों बनाना)।

लेकिन कभी-कभी, हाँ। और उस समय, एमआई से बेहतर काम नहीं करेगा

लेकिन चूंकि एमआई खराब है, कोड की समीक्षाओं में अपनी वास्तुकला की रक्षा के लिए तैयार रहें (और इसका बचाव करना एक अच्छी बात है, क्योंकि अगर आप इसका बचाव करने में सक्षम नहीं हैं, तो आपको ऐसा नहीं करना चाहिए)।

Bjarne Stroustrup के साथ एक साक्षात्कार से:

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

इससे बचने का कोई कारण नहीं है और यह परिस्थितियों में बहुत उपयोगी हो सकता है। हालांकि आपको संभावित मुद्दों के बारे में पता होना चाहिए।

मौत के हीरे होने वाला सबसे बड़ा व्यक्ति:

 class GrandParent; class Parent1 : public GrandParent; class Parent2 : public GrandParent; class Child : public Parent1, public Parent2; 

आपके पास अब बच्चे के भीतर दादाजी के दो "प्रतियां" हैं

सी ++ ने इस के बारे में सोचा है और आपको आभासी वारिस करने के लिए सभी मुद्दों को प्राप्त करने देता है।

 class GrandParent; class Parent1 : public virtual GrandParent; class Parent2 : public virtual GrandParent; class Child : public Parent1, public Parent2; 

हमेशा अपने डिजाइन की समीक्षा करें, यह सुनिश्चित करें कि आप डेटा पुन: उपयोग को बचाने के लिए विरासत का उपयोग नहीं कर रहे हैं। यदि आप एक ही चीज़ को रचना के साथ प्रस्तुत कर सकते हैं (और आमतौर पर आप कर सकते हैं) यह एक बेहतर दृष्टिकोण है

देखें w: एकाधिक विरासत ।

एकाधिक विरासत को आलोचना मिली है और जैसे, कई भाषाओं में लागू नहीं किया गया है आलोचनाओं में शामिल हैं:

  • बढ़ती जटिलता
  • सिमेंटिक अस्पष्टता अक्सर हीरे की समस्या के रूप में सारांशित होती है ।
  • एक वर्ग से स्पष्ट रूप से कई बार प्राप्त करने में सक्षम नहीं है I
  • विरासत का क्रम वर्ग वर्गीकरण बदलना

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

कॉम और जावा इंटरफ़ेस जैसे अंतरफलक (शुद्ध सार वर्ग) का उपयोग करने के लिए इसका समाधान करने का आधुनिक तरीका

मैं इस के स्थान पर अन्य चीजें कर सकता हूं?

हाँ तुम कर सकते हो। मैं GoF से चोरी करने जा रहा हूँ

  • एक इंटरफेस के लिए कार्यक्रम, एक कार्यान्वयन नहीं
  • विरासत पर संरचना को प्राथमिकता दें

सार्वजनिक विरासत एक आईएस-ए रिश्ते है, और कभी-कभी एक वर्ग कई अलग-अलग वर्गों का एक प्रकार होगा, और कभी-कभी इस को प्रतिबिंबित करना महत्वपूर्ण है।

"मिक्सिन्स" कभी-कभी उपयोगी होते हैं। ये आम तौर पर छोटी कक्षाएं होती हैं, आमतौर पर किसी भी चीज़ से वंशानुगत नहीं होती हैं, जो उपयोगी कार्यक्षमता प्रदान करती हैं।

जब तक विरासत पदानुक्रम काफी उथले (जैसा कि लगभग हमेशा होना चाहिए), और अच्छी तरह से प्रबंधित हो, आपको खतरनाक हीरा विरासत प्राप्त करने की संभावना नहीं है। हिरासत सभी भाषाओं के साथ एक समस्या नहीं है जो कि एकाधिक विरासत का उपयोग करते हैं, लेकिन इसके C ++ का उपचार अक्सर अजीब होता है और कभी-कभी puzzling होता है

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

आप को बहु से अधिक भाग नहीं लेना चाहिए, लेकिन आपको 'हीरा समस्या' ( http://en.wikipedia.org/wiki/Diamond_problem ) जैसी समस्याओं के बारे में पता होना चाहिए और आपको देखभाल के साथ दी गई शक्ति का इलाज करना चाहिए , जैसा कि आप सभी शक्तियों के साथ करना चाहिए

आपको इसका ध्यानपूर्वक उपयोग करना चाहिए, डायमंड समस्या की तरह कुछ मामलों में, जब चीजें जटिल हो सकती हैं

वैकल्पिक पाठ http://img.hiwab.com/c%2B%2B/PoweredDevice.gif

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

अन्य लोगों ने इस प्रश्न को संबोधित किया है कि इसके लिए कितने भाग्य अच्छा नहीं है। लेकिन हमने बहुत कुछ टिप्पणियां देखी हैं जो अधिक-कम-कम दर्शाती हैं कि इसका कारण यह बचने का कारण यह सुरक्षित नहीं है। अच्छा, हाँ और नहीं

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

 class CounterMixin { int count; public: CounterMixin() : count( 0 ) {} virtual ~CounterMixin() {} virtual void increment() { count += 1; } virtual int getCount() { return count; } }; class Foo : public Bar, virtual public CounterMixin { ..... }; 

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

ध्यान दें कि "मिश्रण-इन" शब्द का मेरा उपयोग पैरामीटरयुक्त टेम्पलेट क्लास के समान नहीं है (एक अच्छा स्पष्टीकरण के लिए यह लिंक देखें) लेकिन मुझे लगता है कि यह शब्दावली का उचित उपयोग है।

अब मैं इस धारणा को नहीं देना चाहता कि यह एकाधिक विरासत सुरक्षित रूप से उपयोग करने का एकमात्र तरीका है। यह सिर्फ एक तरीका है जो जांचना काफी आसान है।

थोड़ा सा सार होने के जोखिम पर, मैं इसे श्रेणी के सिद्धांत के क्षेत्र में विरासत के बारे में सोचने के लिए रोशन करता हूं।

यदि हम सभी वर्गों और उनके बीच तीर को विरासत सम्बन्ध दिखाते हैं, तो ऐसा कुछ

 A --> B 

का मतलब है कि class B class A से प्राप्त होता है ध्यान दें, दिया गया

 A --> B, B --> C 

हम कहते हैं कि सी बी से प्राप्त होता है जो ए से निकला है, इसलिए सी को ए से प्राप्त करने के लिए कहा जाता है, इस प्रकार

 A --> C 

इसके अलावा, हम कहते हैं कि प्रत्येक श्रेणी A जो A से तमाम A बनाये, इसलिए हमारा विरासत मॉडल श्रेणी की परिभाषा को पूरा करता है अधिक परंपरागत भाषा में, हमारे पास एक श्रेणी Class जिसमें ऑब्जेक्ट्स के साथ सभी वर्गों और विरासत को विरासत वाले संबंध हैं।

यह सेटअप का थोड़ा सा है, लेकिन इसके साथ ही हम अपने डायमंड ऑफ़ डूम पर एक नज़र डालें:

 C --> D ^ ^ | | A --> B 

यह एक छायादार तलाश वाला चित्र है, लेकिन यह करना होगा। तो D A , B , और C सभी हिस्सों से प्राप्त होता C इसके अलावा, और ओपी के सवाल को संबोधित करने के करीब, D भी A किसी भी superclass से विरासत में मिली। हम एक आरेख खींच सकते हैं

 C --> D --> R ^ ^ | | A --> B ^ | Q 

अब, मौत के डायमंड से जुड़ी समस्याएं यहां हैं जब C और B कुछ संपत्ति / विधि के नामों को साझा करते हैं और चीजों को अस्पष्ट लगता है; हालांकि, अगर हम A में कोई साझा व्यवहार ले जाते हैं तो अस्पष्टता गायब हो जाती है।

स्पष्ट शब्दों में रखिए, हम चाहते हैं कि A , B और C ऐसा हो कि यदि B और C उत्तरार्द्ध Q तो A को Q उप-वर्ग के रूप में फिर से लिखा जा सकता है। यह एक पुशआउट नामक एक चीज़ बनाता है

D पर एक सममित निर्माण भी एक पुलबैक कहा जाता है। यह अनिवार्य रूप से सबसे सामान्य उपयोगी वर्ग है जिसे आप B और C दोनों से प्राप्त कर सकते हैं। यही है, यदि आपके पास B और C से विरासत में मिली कोई अन्य श्रेणी R C , तो D एक ऐसा वर्ग है जहां R को D उप-वर्ग के रूप में फिर से लिखा जा सकता है

सुनिश्चित करें कि आपके हीरों की युक्तियां पुलबैक हैं और पुशआउट हमें नाम-संघर्ष या रखरखाव के मुद्दों को संभालते हैं जो अन्यथा उत्पन्न हो सकते हैं।

नोट पार्सबिल का जवाब इस तरह से प्रेरित है क्योंकि उनकी सलाह उपरोक्त मॉडल द्वारा निहित है, क्योंकि हम सभी संभव वर्गों की पूर्ण श्रेणी वर्ग में काम करते हैं।

मैं अपनी बहस को कुछ करने के लिए सामान्य करना चाहता था, जो यह दिखाता है कि कितने जटिल विरासत सम्बन्ध दोनों शक्तिशाली और गैर-समस्याग्रस्त हो सकते हैं

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

उपयोग और वंशानुक्रम का दुरुपयोग

लेख विरासत समझा जाने का एक अच्छा काम करता है, और इसके खतरे हैं

हीरे के पैटर्न से परे, कई विरासत को समझने के लिए ऑब्जेक्ट मॉडल को कठिन बनाना पड़ता है, जिससे बदले में रखरखाव लागत बढ़ जाती है

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

इसके अलावा, रखरखाव के मामले में, "हीरा समस्या" गैर-शाब्दिक विरासत उदाहरणों में भी आती है उदाहरण के लिए, यदि आपके पास ए और बी है और आपकी कक्षा सी दोनों दोनों को विस्तारित करती है, और ए में एक 'मेक्यूज' विधि होती है जो संतरे का रस बनाती है और आप उस स्थान को बढ़ाते हैं जो नींबू के साथ संतरे का रस बनाते हैं: बी 'एक मेक्यूस' विधि जोड़ता है जो विद्युत उत्पन्न करता है? 'ए' और 'बी' अभी "माता-पिता" संगत हो सकते हैं , लेकिन इसका मतलब यह नहीं है कि वे हमेशा ऐसा ही होंगे!

कुल मिलाकर, विरासत से बचने की प्रवृत्ति, और विशेष रूप से कई विरासत, ध्वनि है। सभी चीजों के रूप में, अपवाद हैं, लेकिन आपको यह सुनिश्चित करने की ज़रूरत है कि आप किसी भी अपवाद को इंगित करते हुए एक चमकती हरी नीयन चिन्ह (और अपने मस्तिष्क को प्रशिक्षित करें ताकि जब भी आप ऐसे विरासत के पेड़ देखेंगे जो आप अपनी चमकती हरी नीयन में देखते हैं साइन इन करें), और यह सुनिश्चित करने के लिए जांच करें कि यह सब थोड़ी देर में हर बार समझ में आता है।

ठोस वस्तुओं के एमआई के साथ महत्वपूर्ण मुद्दा यह है कि शायद ही कभी आपके पास कोई ऐसा ऑब्जेक्ट होता है जिसे वैध रूप से "होना चाहिए और बी होना चाहिए", इसलिए यह शायद ही तार्किक आधार पर सही समाधान हो। अधिक बार, आपके पास ऑब्जेक्ट सी है, जो "सी ए या ए बी के रूप में कार्य कर सकता है" का पालन करता है, जिसे आप अंतरफलक विरासत और संरचना के माध्यम से हासिल कर सकते हैं लेकिन कोई गलती न करें- कई इंटरफेस की विरासत अभी भी एमआई है, बस इसका एक सबसेट है

विशेष रूप से सी ++ के लिए, इस सुविधा की मुख्य कमजोरी कई वारंटियों का वास्तविक अस्तित्व नहीं है, लेकिन कुछ इसे निर्माण करने की अनुमति देता है जो लगभग हमेशा खराब होते हैं। उदाहरण के लिए, समान वस्तु की कई प्रतियों का उत्तराधिकारी जैसे:

 class B : public A, public A {}; 

परिभाषा द्वारा विकृत है अंग्रेजी में अनुवादित यह "बी एक ए और ए ए" है। इसलिए, मानव भाषा में भी एक गंभीर अस्पष्टता है क्या आपका मतलब है "बी 2 के रूप में है" या सिर्फ "बी एक ए" है ?. ऐसे रोगविज्ञान कोड को अनुमति देने के लिए और इससे भी बदतर बनाने के लिए इसका इस्तेमाल उदाहरण सी ++ किया, जब यह उत्तराधिकारी भाषाओं में सुविधा रखने के लिए मामला बनाने के लिए कोई अनुकूल नहीं था।

आप विरासत में प्राथमिकता में संरचना का उपयोग कर सकते हैं

आम भावना यह है कि संरचना बेहतर है, और यह बहुत अच्छी तरह से चर्चा की है।

इसमें 4/8 बाइट प्रति क्लास शामिल होता है। (प्रत्येक वर्ग के इस सूचक)।

यह कभी चिंता नहीं हो सकती है, लेकिन अगर एक दिन आपके पास माइक्रो डाटा स्ट्रक्चर होता है जो कि अरबों समय में स्थापित होता है

हम एफिल का इस्तेमाल करते हैं हमारे पास उत्कृष्ट एमआई है कोई चिंता नहीं। कोई बात नहीं। आसानी से प्रबंधित एमआई का उपयोग नहीं करने के लिए कई बार हैं हालांकि, यह लोगों की तुलना में अधिक उपयोगी है क्योंकि वे हैं: ए) किसी खतरनाक भाषा में जो इसे अच्छी तरह से प्रबंधित नहीं करता है- या- बी) उनसे संतुष्ट है कि वे एमआई के लिए कितने साल और वर्षों से काम कर चुके हैं- सी-सी) अन्य कारण ( बहुत सारी सूची में मुझे काफी यकीन है – ऊपर उत्तर देखें)।

हमारे लिए, एफिल का उपयोग करना, एमआई अन्य उपकरण के रूप में स्वाभाविक है और उपकरण बॉक्स में एक अच्छा उपकरण है। सच कहूँ तो, हम काफी निराश हैं कि कोई भी ईफेल का उपयोग नहीं कर रहा है कोई चिंता नहीं। हम आपके पास क्या हैं उससे खुश हैं और आप को देखने के लिए आमंत्रित करते हैं।

जब आप देख रहे हैं: शून्य-सुरक्षा और नल सूचक डीरेंसिंग के उन्मूलन के विशेष ध्यान दें। जब हम सभी एमआई के आसपास नृत्य करते हैं, तो आपके पॉइंटर्स खो रहे हैं! 🙂