क्यों C # कई उत्तराधिकार का समर्थन नहीं करता है?


10

यहां तक ​​कि अगर यह बुरा व्यवहार हो सकता है, तो मैं कहूंगा कि ऐसा समय है कि यह अपने उद्देश्य को पूरा करेगा।


1
मुझे बस इतना पसंद है कि जो कुछ भी Microsoft पैदा करता है (MVP विशेष रूप से इस पर विशेष रूप से निपुण हैं) की अनुपस्थिति के लिए हर कोई इन सभी बहाने बनाता है। मेरा अनुमान है कि अधिकांश लोग जो कई उत्तराधिकार के लाभों को नहीं समझते हैं, वे हैं जो पहली जगह में विरासत को नहीं समझते (और उपयोग नहीं करते हैं), क्योंकि वे कभी-कभी लोकप्रिय कॉपी-एंड पसंद करते हैं पेस्ट-टू-कोड-20-बार जिसे मैं लगभग हर प्रोजेक्ट में हर जगह देखता हूं। इसमें कोई शक नहीं कि जब और जब Microsoft MI को लागू करने का फैसला करता है, तो हर कोई अचानक एक उत्साही उत्साही बन जाएगा, कोई इंतजार नहीं एक "इंजीलवादी", दावा करने के लिए

1
@DaveZiffer शायद, लेकिन सही होना कठिन प्रतीत होता है। क्या आप किसी ऐसी भाषा या कार्यान्वयन के बारे में जानते हैं जहाँ यह वास्तव में अच्छी तरह से काम करती है?

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

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

जवाबों:


14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c इस सवाल को अच्छी तरह से शामिल करता है।

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

उन मामलों के लिए जहां यह अच्छा होगा, आपको इंटरफेस का उपयोग करने की आवश्यकता है। वे काम, यद्यपि अनाड़ी रूप से; लेकिन, आपको उनकी उतनी आवश्यकता नहीं होगी।


8

बस यह स्पष्ट करने के लिए कि क्यों नहीं, एकाधिक वंशानुक्रम C ++ द्वारा समर्थित है, लेकिन दृढ़ता से हतोत्साहित किया जाता है क्योंकि आप रचना के साथ अधिकांश सामान को पूरा कर सकते हैं जो आप एमआई के साथ करेंगे, हालांकि एक बहुत क्लीनर फैशन में। C ++ के विपरीत, C # एक "संकर" प्रकार OOP भाषा नहीं है, अर्थात यह पिछली भाषा से विकसित नहीं हुई है।

यदि आपको वास्तव में कई विरासत की आवश्यकता है, तो आप कई इंटरफेस को लागू कर सकते हैं।


6

वाल्टर ब्राइट डी के निर्माता दोनों हैं, जिसमें एमआई शामिल नहीं है, और एकमात्र व्यक्ति कभी भी अपने द्वारा संपूर्ण C ++ कंपाइलर लिखने के लिए। उनके अनुसार, डी की कमी का कारण यह है कि एमआई की प्रणाली बनाना बहुत कठिन है, जो एक साथ कुशल, सरल और उपयोगी है। मुझे जावा और C # पर समान तर्क का संदेह है। पर्ल और पायथन जैसी भाषाओं में एक प्राथमिक लक्ष्य के रूप में दक्षता नहीं है, इसलिए उनके पास एक ऐसी प्रणाली है जो सरल और उपयोगी है, लेकिन कुशलता से लागू करने के लिए कठिन है। C ++ में लक्ष्य के रूप में सरलता नहीं है, इसलिए इसने एक जटिल जटिल प्रणाली बनाई जो लगभग किसी को समझ में नहीं आती है।

मुझे लगता है कि वाल्टर निशाने पर सही है। यदि कोई ऐसी भाषा मौजूद है जिसमें MI सिस्टम है जो इन तीनों मानदंडों को यथोचित रूप से अच्छी तरह से संतुष्ट करता है, तो कृपया एक टिप्पणी छोड़ दें।


2
आप एफिल, कॉमन लिस्प और डायलन के बारे में क्या सोचते हैं? मुझे पता है कि वे तीनों सरल और उपयोगी दोनों हैं। और मुझे पता है कि कॉमन लिस्प और डायलन दोनों ही प्रदर्शन में C ++ (और अक्सर सी भी) को हरा सकते हैं, ताकि दक्षता को संतुष्ट करने में लगता है। मैं करना जानते हैं कि एफिल संकलक बुरी तरह धीमी है, लेकिन मैं संकलित कोड यह पैदा करता है के प्रदर्शन के बारे में कुछ भी नहीं करने के लिए अगले पता है।
जोर्ग डब्ल्यू मित्तग

3

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


-1

क्योंकि भाषा डिजाइनर स्पष्ट रूप से एक बेहतर C ++ का उत्पादन करना चाहते थे, सामान्य रूप से बेहतर भाषा नहीं। (वे कितने सफल थे, इस पर बहस हो सकती है।)

C ++ - स्टाइल मल्टीपल इनहेरिटेंस में कुछ समस्याएं हैं, और इसलिए C ++ से व्युत्पन्न लोग आम तौर पर इसे छोड़ देते हैं (जावा, C #, D)। अन्य भाषाएं, एफिल और कॉमन लिस्प, दो नाम, इसे अलग तरह से करते हैं और समान समस्याएं नहीं लगती हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.