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。これは解決策ではないはずです。本書のこのセクションでは、本質的にオブジェクト内のクラスの民営化について説明しているようです。私の間違いは何ですか?
私はそのことを考えているいくつかのより多くして、この問題の次の部分が来る:返される型はメソッドを作成するために使用されていることを特定のタイプのそれぞれの場合にしていない 'Element'なければならない理由は、のオブジェクト?私はこれが何らかの形でプライバシー/公然と関連していると思うが、私はポイントを得ることができない...それに本当の意味があるのか、それともコンパイラ特有のものなのだろうか? – noncom
タイプはプライベートなので、その定義スコープの外では表示されません。あなたが本当に望むのは、私的なコンストラクタです。 – extempore