2012-01-05 18 views
8

同じオブジェクトのメソッドを持つオブジェクトのプライベート内部クラスにアクセスするのに少し混乱します。ここではScalaではプログラミング(ページ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) 

} 

コードがブックと同じですが、コンパイラは、Elementオブジェクトのボタンで3つのdef elem()方法について不平を言います。エラーは言う:

プライベートクラスArrayElementは、私は内部クラスからprivate修飾子を削除する場合は、すべてのものになる

pis.Code_c10s02_CompositionAndInheritance.Element.ArrayElement

タイプ の一環として、その定義範囲をエスケープOK。これは解決策ではないはずです。本書のこのセクションでは、本質的にオブジェクト内のクラスの民営化について説明しているようです。私の間違いは何ですか?

答えて

13

何らかの理由で、あまり具体的ではないパブリックタイプを推論するよりもむしろコンパイルに失敗します。 return型で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

関連する問題