यह केवल इसलिए नहीं है क्योंकि A with B
को एक नए प्रकार के रूप में माना जाना चाहिए। स्कैला प्रकार प्रणाली के लिए, यदि A with B
से संबंधित कक्षा मौजूद है, तो इससे कोई फर्क नहीं पड़ता है। एक अज्ञात वर्ग उत्पन्न होता है क्योंकि इसमें पुल मिश्रित लक्षणों में सभी विधियों के लिए विधियों को शामिल करना है।
कारण अज्ञात वर्ग बनाया गया है कि वस्तु से सभी विधियों के कार्यान्वयन होना चाहिए A
और B
से सभी विधियां। जेवीएम बाइटकोड स्तर पर, यह एकाधिक वर्गों को विरासत में वारंट करेगा, और एकाधिक विरासत मॉडल JVM पर समर्थित नहीं है।
एकाधिक वंशानुक्रम अनुकरण के लिए (या mixin रचना, हालांकि आप इसे कॉल करना चाहते हैं), स्काला निम्नलिखित बातें करता है जब आप एक विशेषता बनाने के लिए:
- तो विशेषता
T
कोई विधि कार्यान्वयन है, यह एक बनाता है इंटरफ़ेस जो विशेषता में सभी विधियों को परिभाषित करता है।
यदि विशेषता T
में विधि कार्यान्वयन है, तो यह अतिरिक्त रूप से कक्षा T$class
बनाता है जिसमें T
में प्रत्येक कंक्रीट विधियों के लिए एक स्थिर विधि है। इस स्थैतिक विधि में T
में इसी विधि के समान शरीर है, लेकिन this
पैरामीटर को शामिल करने के लिए इसका हस्ताक्षर बदल दिया गया है।यदि T
था:
def foo(x: Int) = x
तो T$class
होगा:
<static> def foo($this: T, x: Int) = x
वर्ग कुछ वर्ग A
और कुछ विशेषता T
की mixin रचना के द्वारा प्राप्त की तो एक विशेष पुल विधि उत्पन्न जो अग्रेषित करता होगा स्थिर विधि को कॉल जिसमें शरीर होता है। इस तरह, विधि का शरीर प्रत्येक वर्ग में डुप्लिकेट नहीं किया जाता है जो T
में मिश्रित होता है। यही कारण है कि अनाम वर्ग को बनाया जाना है - इसमें T
में प्रत्येक विधि के लिए पुल विधियों को परिभाषित करना होगा।
यहां एक उदाहरण है। जब आप मिश्रित संयोजन करके एक नई कक्षा बनाते हैं, उदा। फोन new A with T
:
class A {
def bar = println("!")
}
<interface> T {
def foo(x: Int): Int
}
class T$class {
<static> def foo($this: T, x: Int) = x
}
class $anon extends A <implements> T {
// notice that `bar` is inherited, but `foo` is not
<bridge> def foo(x: Int) = T$class.foo(this, x)
}
new $anon
सूचना है कि संकलक वास्तव में, foo
को callsites पुनर्लेखन सकता है बल्कि callsite से सीधे स्थिर तरीकों कॉल करने के लिए:
class A {
def bar = println("!")
}
trait T {
def foo(x: Int) = x
}
new A with T
संकलक यह मोटे तौर पर कुछ इस तरह करने के लिए फिर से लिखने होगा एक पुल विधि के माध्यम से। यही कारण है कि ऐसा नहीं किया जाता है क्योंकि तब यह सबटाइपिंग पॉलिमॉर्फिज्म का समर्थन नहीं करेगा।
+1 विशेष रूप से एक उदाहरण दिखाने के लिए! –
ग्रेट उत्तर, बहुत बहुत धन्यवाद। –
ध्यान दें कि '-Xprint: mixin' तर्क के साथ 'स्केलैक' को कॉल करना स्कैला बनाता है जो सटीक निर्माण दिखाएगा। '-Xshow-phases' अन्य चरणों को दिखाता है जिनका उपयोग '-Xprint:' के साथ किया जा सकता है। – outis