2010-08-06 16 views
9

में स्व प्रकार विरासत मैं निम्नलिखित लक्षण है कहते हैं:स्केला

trait A 

trait B { this: A => } 

trait C extends B // { this: A => } 

संकलक त्रुटि: illegal inheritance; self-type C does not conform to B's selftype B with A
जैसी उम्मीद थी कि अगर मैं स्वयं प्रकार एनोटेशन uncomment, संकलक खुश है।

मुझे लगता है कि यह स्पष्ट है कि सी को भी इस प्रकार की आवश्यकता क्यों है। मुझे समझ में नहीं आता कि यह ए से "उत्तराधिकारी" क्यों नहीं कर सकता है अगर संकलक पहले से ही यह पता लगा सकता है कि इसकी आवश्यकता है?

मुझे लगता है कि जब आप जटिल पदानुक्रमों के साथ स्वयं प्रकारों का उपयोग करते हैं तो यह शब्दकोष को कम कर सकता है, खासकर यदि आप लक्षणों के एक बड़े समूह में मिश्रण करते हैं, उनमें से प्रत्येक का अपना स्वयं का प्रकार होता है।

मुझे लगता है कि वर्तमान व्यवहार के लिए शायद एक अच्छा कारण है, मैं बस यह नहीं ढूंढ पाया/समझ सकता हूं कि यह क्या है।

पहले मैंने सोचा कि यह मिक्सीन रैखिकरण से संबंधित हो सकता है, लेकिन ऐसा लगता है कि यह यहां नहीं खेलता है (भले ही मेरे पास अधिक जटिल आत्म प्रकारों के साथ मिश्रित अधिक गुण हों)।

क्या इससे कुछ मामलों में अस्पष्टताएं पैदा होंगी? यदि हां, तो कोई अस्पष्टता नहीं होने पर यह क्यों काम नहीं कर सकता?

या क्या यह इसके उचित कार्यान्वयन में कुछ कठिनाइयों से संबंधित है?

मुझे विषय के बारे में कुछ चर्चाएं मिल सकती हैं (जैसे self type is not inherited), लेकिन वे ज्यादातर समस्या को बताते हैं और निष्कर्ष निकालते हैं कि यह बिना किसी स्पष्टीकरण और/या समाधान (यदि यह मौजूद है) के बिना है।

उत्तर

1
trait C extends B with A 

एकमात्र समाधान नहीं है। तुम भी

trait AA extends A 
trait C extends B with AA 

है, सब कुछ विरासत में कि A के इंटरफेस स्वीकार किया जाता है हो सकता था। यदि आपको ठोस कार्यान्वयन पर भरोसा करना चाहिए, तो आप एक मिश्रण चुनेंगे; यदि कार्यान्वयन उपयोगकर्ता तक है या आपके पास विशेषता में मिश्रण को निर्दिष्ट न करने का एक अच्छा कारण है (उदाहरण के लिए निर्भरता मुद्दों को ढीला करने के लिए), तो आप इसे एक स्व-प्रकार बना देंगे।

+1

मुझे लगता है कि यह मेरे लिए स्पष्ट है कि एक विशेषता में मिश्रण के बीच क्या अंतर है या इसे स्वयं प्रकार बनाते हैं। मेरा सवाल यह है कि यह मानते हुए कि मैं पिछले प्रकार के स्वयं के प्रकार के साथ चाहता हूं और मिश्रण कर रहा हूं और संकलक यह समझ सकता है कि मुझे (कम से कम) ए को स्वयं प्रकार के सी के रूप में आवश्यकता है क्यों यह स्वचालित रूप से इसे "जोड़" नहीं सकता है? –

+0

मुझे लगता है कि कई अवसरों में अवांछित होगा क्योंकि यह आपको कक्षा का विशेषज्ञ होने का मौका दिए बिना संकलित करेगा। और वर्तमान दायरे में 'ए' उपलब्ध नहीं होने पर क्या करना है? मुझे विश्वास है कि भ्रमित हो जाएगा और वह विरासत और मिश्रण स्पष्ट किया जाना चाहिए। इसके अलावा, जब आप टाइपिंग को सहेजना चाहते हैं, तो आप एक 'विशेषता सीए को ए के साथ सी बढ़ाता है और इसका उपयोग कर सकते हैं। – Debilski

+1

डेबिलस्की, आप इस सवाल को गलत समझ रहे हैं। ओपी चाहता है कि "विशेषता सी बी को बढ़ाती है" के बराबर होने के लिए "विशेषता सी बी {यह: ए =>}" बढ़ाती है, न कि "विशेषता सी बी के साथ बी बढ़ाती है"। – Blaisorblade

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