2012-01-05 13 views
8

मुझे एक वस्तु के निजी आंतरिक वर्गों को उसी ऑब्जेक्ट के तरीकों से एक्सेस करने के बारे में थोड़ा भ्रम है। यहाँ प्रोग्रामिंग से स्काला में मेरे अभ्यास का कोड (पृष्ठों 245-246) है:स्केल ऑब्जेक्ट आंतरिक कक्षाओं और विधियों के साथ निजी दायरा

import Element.elem 

abstract class Element { 
    def contents: Array[String] 
    def height = contents.length 
    def width = if(height == 0) 0 else contents(0).length 

    def above(that: Element): Element = elem(this.contents ++ that.contents) 

    def beside(that: Element): Element = { 
    elem(for(
      (line1, line2) <- this.contents zip that.contents) 
      yield line1 + line2) 
    } 

    override def toString = contents mkString "\n" 
} 


object Element { 

    private class ArrayElement (
      val contents: Array[String] 
    ) extends Element 

    private class LineElement (s: String) extends ArrayElement(Array(s)) { 
      override def width = s.length 
      override def height = 1 
    } 

    private class UniformElement (
      val ch: Character, 
      override val width: Int, 
      override val height: Int 
    ) extends Element { 
      private val line = ch.toString * width 
      def contents = Array.fill(height)(line) 
    } 

    def elem(ss: Array[String]) = new ArrayElement(ss) 
    def elem(s: String) = new LineElement(s) 
    def elem(ch: Character, w: Int, h: Int) = new UniformElement(ch, w, h) 

} 

कोड किताब में के रूप में ही है, लेकिन संकलक तत्व वस्तु के botton से कम तीन def elem() तरीकों के बारे में शिकायत । त्रुटि का कहना है:

निजी वर्ग ArrayElement

तथापि प्रकार का हिस्सा pis.Code_c10s02_CompositionAndInheritance.Element.ArrayElement के रूप में अपनी को परिभाषित गुंजाइश निकल जाता है, अगर मैं भीतरी वर्गों से private संशोधक निकालने के लिए, सब कुछ हो जाता है ठीक। यह समाधान नहीं होना चाहिए, ऐसा लगता है कि पुस्तक का यह खंड अनिवार्य रूप से किसी ऑब्जेक्ट के अंदर कक्षाओं को निजीकृत करने के बारे में है। मेरी गलती यहाँ क्या है?

उत्तर

13

किसी कारण से यह कम विशिष्ट लेकिन सार्वजनिक प्रकार के अनुमान के मुकाबले संकलन में असफल हो जाएगा। वापसी प्रकार के साथ elem विधियों घोषित करें।

def elem(ss: Array[String]): Element    = new ArrayElement(ss) 
def elem(s: String): Element      = new LineElement(s) 
def elem(ch: Character, w: Int, h: Int): Element = new UniformElement(ch, w, h) 
+0

मुझे लगता है कि के बारे में सोचा है कुछ और है और वहाँ तो इस सवाल के अगले भाग आता है: क्यों लौटे प्रकार 'विशिष्ट प्रकार प्रत्येक मामले में और नहीं होने के लिए Element' इस विधि का एक बनाने के लिए प्रयोग किया जाता है की वस्तु? मुझे लगता है कि यह किसी भी तरह से गोपनीयता/प्रचार से संबंधित है लेकिन मुझे बिंदु नहीं मिल सकता है ... क्या इसका कोई वास्तविक अर्थ है या यह एक कंपाइलर क्विर्क है? – noncom

+0

प्रकार निजी है, इसलिए यह अपने परिभाषित क्षेत्र के बाहर दिखाई नहीं दे रहा है। ऐसा लगता है कि आप वास्तव में क्या चाहते हैं एक निजी निर्माता है। – extempore

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

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