2010-11-25 11 views
8

मान लीजिए मैं इस स्काला कोड है:मेरे नेस्टेड साथी ऑब्जेक्ट के सदस्य कक्षा में स्वचालित रूप से क्यों दिखाई नहीं दे रहे हैं?

object Outer { 

    object Inner { 
    val B = "B" 
    } 
    class Inner { 
    def b = B 
    } 
} 

मैं इस संकलन की उम्मीद करेंगे, लेकिन Bb की परिभाषा से पहुँचा नहीं जा सकता। मुझे इसे बनाने के लिए class Inner में import Inner._ जोड़ने की आवश्यकता है। ऐसा क्यों है? क्या साथी ऑब्जेक्ट Inner सही ढंग से परिभाषित नहीं है?

+0

का उपयोग करके इसे प्रदूषित कर सकते हैं मैं यहां * फिर * (चीज़ भूल जाने के बाद) आया था, यह दर्शाता है कि यह समस्या नवागंतुकों के लिए कितनी महत्वपूर्ण हो सकती है। मुझे लगता है कि 'बाहरी' सवाल में कोई भूमिका नहीं निभाता है; यह इसके बिना भी वही है। यह पूछने के लिए धन्यवाद! – akauppi

उत्तर

6

यह इस तरह से काम नहीं करना चाहिए - import Inner._ का उपयोग एक सतत व्यवहार है।


आम तौर पर, यदि आप जावा में स्थिर सदस्यों के समान व्यवहार प्राप्त करना चाहते हैं तो साथी वस्तु की आवश्यकता होती है।

object Outer { 

    object Inner { 
    def print(inner: Inner) = inner.B // compiles! 
    }  
    class Inner { 
    private val B = "B" 
    }  
} 

आप वर्ग के लिए एक कारखाने के रूप में साथी वस्तु का उपयोग कर सकते हैं: स्काला तरह से सभी स्थैतिक सदस्यों लाभ यह है कि एक साथी वर्ग के निजी/संरक्षित सदस्य ही यह से पहुँचा जा सकता के साथ, एक सिंगलटन वस्तु को दूर ले जाने के लिए है एक निजी निर्माता के साथ:

scala> object Outer { 
    | 
    | object Inner { 
    |  def newInstance = new Inner() 
    | } 
    | class Inner private() { 
    |  private val B = "B" 
    | } 
    | } 
defined module Outer 

scala> Outer.Inner.newInstance 
res1: Outer.Inner = [email protected] 

scala> new Outer.Inner 
<console>:7: error: constructor Inner cannot be accessed in object $iw 
     new Outer.Inner 
    ^
+0

मैं बी को निरंतर के रूप में परिभाषित करना चाहता हूं, जिसे क्लास ऑउटर में इस्तेमाल किया जाता है। आंतरिक और बाहरी दुनिया के लिए भी पहुंचा जा सकता है। Inner.B। मैं इस धारणा के तहत था कि अगर इंनेर को घोंसला नहीं दिया गया तो मुझे आयात की आवश्यकता नहीं थी, लेकिन मुझे लगता है कि मैं गलत था, क्योंकि मेरा उदाहरण या तो संकलित नहीं होता है अगर मैं बाहरी वर्ग को हटा देता हूं ... तो बेटों का तरीका क्या है 'सार्वजनिक स्थैतिक अंतिम स्ट्रिंग बी = "बी" के समान, स्थिरांक को परिभाषित करने के लिए;' मैं जावा में लिखूंगा? –

+0

कोई समस्या नहीं दिख रही -> https://gist.github.com/715219 –

+0

ठीक है, मुझे बस पुष्टि की आवश्यकता है कि मुझे अतिरिक्त आयात की आवश्यकता है। मेरी तरफ से ठीक है; मैं बस सोच रहा था कि सदस्यों को स्वचालित रूप से साथी वस्तुओं/कक्षाओं में आयात किया गया था। –

11

साथी वस्तु के सदस्यों वर्ग में आयात किया जा चाहते हैं, तो यह प्रोग्रामर यह controle करने में सक्षम होने के बिना वर्ग की नामस्थान को दूषित होगा। यह मूल्यों के साथ खराब (लेकिन अभी भी खराब) नहीं हो सकता है लेकिन मैं वास्तव में कार्यों के साथ देखना नहीं चाहता।

बस apply() या गुणों से प्राप्त होने वाले कार्यों के बारे में सोचें (दोनों मामलों में जहां आप कुछ खोने के बिना नाम बदल नहीं सकते हैं)। यदि ये फ़ंक्शंस स्वचालित रूप से आपके कक्षा नामस्थान में आयात किए जाते हैं, तो संकलक को पता नहीं चलेगा कि किस का उपयोग करना है। इसलिए यदि कक्षा और ऑब्जेक्ट में func() फ़ंक्शन था तो आप अपने क्लास कोड में this.func() लिखना समाप्त कर देंगे ताकि यह सुनिश्चित किया जा सके कि कौन सी कॉल करनी है।

तो इसे अपने नामस्थान को साफ रखने की संभावना के रूप में देखें। आप अभी भी import Inner._

+0

आपको उचित आयात की आवश्यकता क्यों है। इसमें काफी सार्थकता है। –

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

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