2012-06-28 12 views
5

संभव डुप्लिकेट:
What is the difference between scala self-types and trait subclasses?ऑब्जेक्ट स्व-एनोटेशन का क्या अर्थ है?

मैं संकलक, जहां प्रोग्रामर प्रकट होता है कि एक विशेषता है एनोटेट एक के साथ Mixin हो जाएगा करने के लिए एक वादा के रूप में एक आत्म एनोटेशन को समझते हैं। उदाहरण के लिए:

scala> trait X 
defined trait X 

scala> trait Y { this: X => } 
defined trait Y 

scala> new Y {} 
<console>:10: error: illegal inheritance; 
self-type Y does not conform to Y's selftype Y with X 
       new Y {} 
       ^

scala> new Y with X {} 
res1: Y with X = [email protected] 

पिछले उदाहरण में, तीसरी अभिव्यक्ति विफल रही क्योंकि हमने नए उदाहरण में मान्य एक्स सेट नहीं किया था। जाहिर है, आखिरी एक अच्छा काम करता है। अब तक सब ठीक है. और अब, चलिए एक और उदाहरण देखें जिसमें एक वस्तु शामिल है।

scala> object Z { this: X => } 
defined module Z 

मैं समझता हूँ कि वस्तु अगली पंक्तियों में, जहां लक्षण थोड़ा संशोधित किया गया है में प्रतिनिधित्व के रूप में एक्स वादे के साथ नाकाम रहने के (हम एक भविष्य वादे के साथ अब एक उदाहरण बना रहे हैं!) Instantiated की जा रही है,:

scala> trait X { class X1 } 
defined trait X 

scala> trait Y { this: X => new X1 } 
defined trait Y 

scala> object Z { this: X => new X1 } 
<console>:8: error: not found: type X1 
     object Z { this: X => new X1 } 
           ^

तो ऑब्जेक्ट स्व-एनोटेशन का क्या अर्थ है?

उत्तर

3

वास्तव में, आप कक्षाओं के साथ एक ही काम कर सकते हैं - एक स्व-प्रकार जोड़ें जो विरासत में नहीं है, लेकिन आप इस तरह के वर्ग को तुरंत चालू नहीं कर पाएंगे।

की अनुमति दे सिंगलटन वस्तुओं स्वयं प्रकार किसी भी तरह से कार्यक्रमों को रद्द नहीं करता है करने के लिए - आप बस आत्म प्रकार के तरीकों में से किसी भी फोन करने में सक्षम सिंगलटन वस्तु के भीतर से (अपने इनर क्लासों का दृष्टांत या) नहीं होगा, क्योंकि यह आत्म-प्रकार का वारिस नहीं था।

फिर भी, यह एक बग हो सकता है, आप file a bug की इच्छा कर सकते हैं।

+0

मुझे लगता है कि वर्ग के मामले में, उदाहरण के लिए: "वर्ग एक {इस: एक्स => नई एक्स 1}" आप "एक्स के साथ नए ए 'के साथ खेल सकते हैं, तो यह समझ है, लेकिन मैं किसी भी स्थिति जहां नहीं मिल सकता है किसी को किसी ऑब्जेक्ट में स्वयं एनोटेशन की आवश्यकता हो सकती है। – jeslg

+0

सच है, वस्तुओं और अंतिम कक्षाओं के लिए, यह कोई समझ नहीं आता कि मैं देख सकता हूं। – axel22

+0

आपको याद है, मुझे लगता है कि अगर वे एक विशेषता या कक्षा के सदस्य हैं तो वस्तुओं को वास्तव में ओवरराइड किया जा सकता है। –

संबंधित मुद्दे