2011-08-30 21 views
19

अलावा विरासत पहलू से, वहाँ निम्नलिखित वर्ग टेम्पलेट्स बीच एक अंतर है:और क्या स्काला मुहावरेदार है: विशेषता TraitA फैली TraitB या विशेषता TraitA {स्वयं: TraitB =>}

1| trait TraitA extends TraitB 

2| trait TraitA { self: TraitB => } 

मैं चाहते हैं TraitA और TraitB के बीच विभाजित जिम्मेदारियां लेकिन पूर्व बाद के बिना काम नहीं कर सकते हैं।

आप इस इरादे को कैसे व्यक्त करेंगे? मेरे लिए समाधान [2] अधिक प्राकृतिक दृष्टिकोण होगा। हालांकि मैं किसी भी तरह मिश्रित करने की आवश्यकता में मिश्रण करने वाले कार्यान्वयन करने वालों पर बोझ नहीं डालना चाहता हूं।

+0

संभावित डुप्लिकेट [स्केल स्व-प्रकार और विशेषता उप-वर्गों के बीच क्या अंतर है?] (Http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types- और-विशेषता-उप-वर्ग) –

उत्तर

16

मेरी वरीयता आमतौर पर [1] है, क्योंकि जैसा कि आप कहते हैं, कार्यान्वयन को TraitB में मिश्रण करने के लिए बोझ नहीं किया जाता है। शायद [2] बेहतर है अगर, किसी कारण से, यह TraitB में ठोस कार्यान्वयन के उत्तराधिकारी के लिए वांछनीय है और TraitB के उप-प्रकारों के बीच विकल्प बनाने के लिए लागू करने के लिए मजबूर होना चाहिए। फिर भी, [1] उतना ही लचीला है।

मैं उपयोग करने के लिए [2] केवल जहां आवश्यक हो, जैसे कि जब प्रकार एक ज्ञात वर्ग या विशेषता नहीं है,

// Here, Matrix cannot extend type parameter Repr 
trait Matrix[+Repr <: Matrix[Repr]] { self: Repr => 
    ... 
} 

अपडेट करते हैं। यहाँ एक और नाबालिग अंतर है,

trait B 
trait A { self: B => } 
def g(ab: A): B = ab // Type mismatch: found A, required B 

है यह एक B रूप A उपयोग करने के लिए, भले ही प्रकार शामिल किया गया है में सक्षम नहीं हो रहा है एक छोटे से परेशानएक वैकल्पिक प्रतिबंध

+2

आपके अपडेट के बारे में बोलते हुए। मुझे लगता है कि "थोड़ा परेशान" एक व्यक्त करने के लिए काफी उपयोगी है कि एक 'ए' "सहयोग करता है" लेकिन साथ ही "एक 'बी' नहीं है। मेरे लिए यह क्रमशः निजी बनाम सार्वजनिक विरासत की तरह है। –

+0

आह, यह सोचने का एक अच्छा तरीका है। मैं फिर से अपडेट करूंगा। –

+0

ऐतिहासिक रूप से, आत्म-प्रकार की एनोटेशन के लिए प्रेरणा पहला अंतर है-कम से कम, इस प्रकार यह विशेषता पेपर * स्केलेबल कंपोनेंट एब्स्ट्रैक्शन * में ओडरस्की और ज़ेंगर द्वारा प्रेरित की जाती है (जिसे आप रुचि रखते हैं तो Google विद्वान पर पा सकते हैं)। – Blaisorblade