2012-02-16 9 views
6

मैं निम्नलिखित कोड है:स्काला - इसके आयात (इनहेरिट आयात) के साथ एक विशेषता में मिश्रण

trait A { 
    import org.somepackage.C._ 
} 

class B extends A { 
    def getValue = value 
       ^^^^^ 
} 

object C { 
    var value = 5 
} 

वर्ग B में मूल्य दिखाई नहीं देता है क्या इसका मतलब है कि वर्ग A के निहित आयात द्वारा विरासत में मिला नहीं किया गया था B, हालांकि valueA के अंदर पूरी तरह से दिखाई देता है। विरासत आयात करने के प्रभाव को कैसे प्राप्त किया जाए, इसलिए मैं कई वर्गों में स्पष्ट रूप से एक ही चीज़ों को आयात करने से बच सकता हूं जहां A विशेषता है?

+1

[स्केल में, मैं उप-वर्गों के माध्यम से आयात विवरण कैसे पास करूं?] (Http://stackoverflow.com/questions/7252126/in-scala-how-do-i-pass-import-statements- उप-से-सबक्लास) – Suma

उत्तर

11

आयात प्रथम श्रेणी इकाई नहीं है, जो व्यवहार आप उम्मीद कर रहे हैं प्रदर्शित नहीं करते हैं। इसके बजाय आप कुछ बंद प्राप्त करने के लिए thusly अपने डिजाइन पुनर्गठन कर सकते हैं:

trait A with C { 

} 

class B extends A { 
    def getValue = value // Now this will work. 
} 

trait C { 
    var value = 5 
} 

object C extends C 

यह मुहावरा संभव के रूप में कुछ आयात के साथ कर उपयोगकर्ताओं के लिए Scalaz 6 में प्रयोग किया जाता है।

+0

यह केवल तभी काम करता है जब 'सी' एक विशेषता है। क्या होगा यदि 'सी' कुछ और है (मेरे मामले में, 'सी' एक विधि है)? जब मैं इस पैटर्न का उपयोग करने की कोशिश करता हूं, तो यह कहता है कि 'प्रतीक सी को हल नहीं किया जा सकता है (जहां' सी 'विधि का नाम है जिसे मैं अन्यथा' com.xyz.C' के माध्यम से आयात कर रहा हूं)। – socom1880

+0

इसके अलावा, अगर मैं 'com.xyz._' में सबकुछ शामिल करना चाहता हूं तो क्या होगा? – socom1880

+0

उपर्युक्त दोनों के लिए, आपको कार्यान्वयन को एक विशेषता में स्थानांतरित करने की आवश्यकता है, फिर एक ऑब्जेक्ट है जो उत्तर में जैसे विशेषता को आसानी से बढ़ाता है। "मिश्रण" करने के लिए लक्षणों को बढ़ाया जा सकता है, वस्तुएं नहीं कर सकती हैं। Com.xyz._ जैसे सब कुछ शामिल करने के लिए आपको एक पैकेज ऑब्जेक्ट के माध्यम से com.xyz को कार्यान्वित करने की आवश्यकता है - पैकेज ऑब्जेक्ट के साथ समान रूप से कार्यान्वित किया गया है जिसमें सभी वास्तविक कार्यान्वयन होते हैं। फिर, आप उस विशेषता का उपयोग कहीं और "मिश्रण" करने के लिए कर सकते हैं। – RD1

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