यदि लक्षण A, B को बढ़ाता है, तो A में मिलाने से आप B को जोड़ते हैं या जो बढ़ाते हैं, ठीक बी करते हैं। इसके विपरीत, यदि लक्षण ए में एक आत्म संदर्भ है जो स्पष्ट रूप से बी के रूप में टाइप किया जाता है, तो अंतिम माता-पिता वर्ग को भी बी या वंशज प्रकार के बी में मिश्रण करना चाहिए (और इसे पहले मिलाएं , जो महत्वपूर्ण है)।
यही सबसे महत्वपूर्ण अंतर है। पहले मामले में, सटीक प्रकार B को बिंदु A पर क्रिस्टलीकृत किया जाता है। दूसरे में, मूल वर्ग के डिजाइनर को यह तय करना होता है कि B का कौन सा संस्करण उपयोग किया जाता है, उस बिंदु पर जहां मूल वर्ग की रचना की गई है।
एक और अंतर यह है कि ए और बी एक ही नाम के तरीके प्रदान करते हैं। जहां A, B का विस्तार करता है, A का तरीका B के ओवरराइड करता है। जहाँ A को B के बाद मिलाया जाता है, A की विधि बस जीत जाती है।
टाइप किया गया आत्म संदर्भ आपको बहुत अधिक स्वतंत्रता देता है; A और B के बीच युग्मन ढीला है।
अपडेट करें:
चूंकि आप इन अंतरों के लाभ के बारे में स्पष्ट नहीं हैं ...
यदि आप प्रत्यक्ष उत्तराधिकार का उपयोग करते हैं, तो आप विशेषता A बनाते हैं जो B + A है। तुमने संबंध पत्थर में सेट कर दिया है।
यदि आप टाइप किए गए सेल्फ रेफरेंस का उपयोग करते हैं, तो कोई भी व्यक्ति जो आपकी विशेषता ए का उपयोग कक्षा सी में करना चाहता है, कर सकता है
- मिक्स B और फिर A को C में मिलाएं।
- B का एक उपप्रकार और फिर A को C में मिलाएं।
- मिक्स A को C में, जहाँ C, B का उपवर्ग है।
और यह उनके विकल्पों की सीमा नहीं है, जिस तरह से स्काला आपको एक कोड ब्लॉक के साथ सीधे उसके निर्माणकर्ता के रूप में एक विशेषता को तुरंत हटाने की अनुमति देता है।
ए की पद्धति जीतने के बीच के अंतर के लिए , क्योंकि ए को अंतिम में मिलाया जाता है, ए की तुलना में एक विस्तारित बी, इस पर विचार करें ...
जहाँ आप लक्षणों के अनुक्रम में मिलाते हैं, जब भी विधि foo()
को लागू किया जाता है, तो कंपाइलर अंतिम विशेषता को देखने के लिए मिश्रित हो जाता है foo()
, तब (यदि नहीं मिला), तो यह अनुक्रम को बाईं ओर तब तक ट्रेस करता है जब तक कि वह एक गुण नहीं खोज लेता है जो लागू होता है foo()
और उपयोग करता है उस। ए में कॉल करने का विकल्प भी होता है super.foo()
, जो अनुक्रम को बाईं ओर तब तक ट्रेस करता है जब तक कि यह एक कार्यान्वयन नहीं पाता है, और इसी तरह।
अतः यदि A का B के लिए टाइप किया गया आत्म संदर्भ है और A का लेखक जानता है कि B लागू करता है foo()
, तो A यह super.foo()
जानकर कॉल कर सकता है कि यदि और कुछ नहीं प्रदान करता है foo()
, तो बी विल। हालांकि, क्लास सी के निर्माता के पास किसी भी अन्य गुण को लागू करने का विकल्प होता है foo()
, जिसमें ए और उसके बदले ए मिलेगा।
फिर, यह एक विस्तारित बी की तुलना में बहुत अधिक शक्तिशाली और कम सीमित है और सीधे बी के संस्करण को बुला रहा है foo()
।