मिश्रण या लक्षण सादे बहु विरासत से बेहतर कैसे हैं?


54

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

क्या विशेष रूप से उन्हें कम खतरनाक बनाता है? क्या ऐसी कोई चीज़ है जो मिश्रणों / लक्षणों के साथ संभव नहीं है लेकिन C ++ शैली बहु विरासत के साथ संभव है? क्या उनके साथ हीरे की समस्या में भागना संभव है?

ऐसा लगता है जैसे हम कई विरासत का उपयोग कर रहे थे लेकिन सिर्फ यह बहाना बना रहे थे कि वे मिश्रण / लक्षण हैं इसलिए हम उनका उपयोग कर सकते हैं।


7
किसी के लिए एक अच्छी तरह से लिखा, विचारशील और पूरी तरह से इस जवाब के लिए आगे देख रहे हैं।
रॉबर्ट हार्वे

7
रूबी और पीएचपी ने मिश्रण और लक्षण पेश नहीं किए। फ़्लेवर (1980) में मिक्सिंस पेश किए गए, स्क्वीट स्मॉलटाक (2001) में ट्रिट्स पेश किए गए। जायके कई विरासत के साथ पहली पहली वस्तु उन्मुख भाषा थी, और इसमें मिश्रण का उपयोग किया गया था। सी ++ को केवल संस्करण 2.0 में कई विरासत मिलीं, जो कि फ्लेवर्स के 9 साल बाद 1989 में रिलीज़ हुई थी। तो, सवाल यह होना चाहिए: जायके में सादे मिश्रण होते हैं, लेकिन कुछ भाषाओं जैसे सी ++ में एक ही काम करने के लिए अजीब वाक्यविन्यास होता है और इसे कई विरासत कहा जाता है।
जोर्ग डब्ल्यू मित्तग

जवाबों:


31

कई समस्याओं के साथ कई समस्याएं हैं जब इसका उपयोग पूर्ण विकसित वर्गों के साथ किया जाता है, लेकिन वे सभी अस्पष्टता के चारों ओर घूमते हैं ।

अस्पष्टता कुछ अलग तरीकों से दिखाई देती है:

  1. यदि आपके पास एक ही क्षेत्र के साथ दो आधार कक्षाएं हैं x, और व्युत्पन्न प्रकार पूछते हैं x, तो यह क्या मिलता है?
    • यदि दो xचर में असंगत प्रकार हैं, तो आप इसका अनुमान लगा सकते हैं।
    • यदि वे एक ही प्रकार के हैं, तो आप उन्हें एक ही चर में मिलाने का प्रयास कर सकते हैं।
    • आप हमेशा उन्हें अजीब तरह से योग्य नामों के रूप में उजागर कर सकते थे।
  2. यदि आपके पास fसमान हस्ताक्षर वाले समान फ़ंक्शन के साथ दो आधार कक्षाएं हैं , और कोई कॉल करता है f, जिसे कहा जाता है?
    • क्या होगा अगर दो आधार वर्ग एक अन्य सामान्य आभासी पूर्वज (हीरे की समस्या) को साझा करते हैं।
    • क्या होगा यदि फ़ंक्शन में भिन्न, लेकिन संगत हस्ताक्षर हैं?
  3. जब आप दो बेस क्लास के साथ एक क्लास का निर्माण करते हैं, तो बेस क्लास के किस कंस्ट्रक्टर को पहले कहा जाता है? जब आप उस वस्तु को नष्ट करते हैं, जो मारा जाता है?
  4. जब आप ऑब्जेक्ट को मेमोरी में रखते हैं, तो आप इसे लगातार कैसे करते हैं?
  5. 3 बेस कक्षाओं के साथ आप इन सभी मामलों को कैसे संभालते हैं? 10?

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

लक्षण या मिक्स-इन (या इंटरफेस, या ...) सभी निर्माण हैं जो विशेष रूप से एक प्रकार की क्षमताओं को सीमित करते हैं ताकि कोई अस्पष्टता न हो। वे शायद ही कभी खुद कुछ भी करते हैं। यह प्रकारों की संरचना को चिकनी बनाने की अनुमति देता है क्योंकि दो चर या दो कार्य नहीं हैं ... एक चर और एक संदर्भ है; एक समारोह और एक हस्ताक्षर। कंपाइलर जानता है कि क्या करना है।

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

क्या ऐसी कोई चीज़ है जो मिश्रणों / लक्षणों के साथ संभव नहीं है लेकिन C ++ शैली बहु विरासत के साथ संभव है?

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

क्या उनके साथ हीरे की समस्या में भागना संभव है?

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


क्या आप मुझे उदाहरण के लिए "बिल्डिंग" प्रकारों की अनुमति देने वाली भाषा / तकनीक की छूट दे सकते हैं?
घुमारवीं

@german - मैं निश्चित रूप से कोई स्काला विशेषज्ञ नहीं हूं, लेकिन मेरी समझ यह है कि withकीवर्ड वहाँ क्या करता है।
तेलस्तीन

"निर्माण करता है जो विशेष रूप से एक प्रकार की क्षमताओं को सीमित करता है ताकि कोई अस्पष्टता न हो": किस प्रकार की सीमाएं? इंटरफेस में चर नहीं होते हैं, इसलिए यह एक सीमा है, लेकिन स्काला लक्षण और रूबी मॉड्यूल करते हैं। क्या वे अन्य तरीकों से सीमित हैं?
डेविड मोल्स

@DavidMoles - यह सामान्य तरीका है, मैंने आभासी प्रेषण नियमों पर सीमाएं भी देखी हैं (लगता है कि C # का स्पष्ट रूप से हस्तक्षेप किया गया है)।
तेलस्तीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.