6

オブジェクト指向設計クラスの宿題に取り組んでいますが、Scala のコンパニオン オブジェクトで問題が発生しています。コンパニオン オブジェクトがコンパニオン クラスのプライベート メソッドにアクセスできるはずだといくつかの場所で読んだことがありますが、それを機能させることができないようです。(メモとして、割り当ての内容は二分探索木の実装に関係していたので、答えを求めているだけではありません...)

私はプライベート クラス BstAtlas のインスタンスを作成することになっているオブジェクトを持っています (Bst は Atlas オブジェクトでも定義されていますが、明確にするためにそれを取り出しました)。

object Atlas {                                             
  def focusRoom(newRoom:Room,a:Atlas):Atlas = a.helpFocusRoom(newRoom);

  abstract class Atlas {
    ...
    protected def helpFocusRoom(n:Room):Atlas;
    ...
  }

  private class BstAtlas(bst:Bst) extends Atlas {
    ...
    protected def helpFocusRoom(newRoom:Room):Atlas = ...
       // uses some of bst's methods
    ...
  }
}

しかし、コンパイルに行くと、次のエラーが発生します。

Question23.scala:15: エラー: メソッド helpFocusRoom に Atlas.Atlas でアクセスできません a.helpFocusRoom(newRoom);

関数 helpFocusRoom を非表示にする必要がありますが、非表示にする方法がわかりませんが、コンパニオン オブジェクト内でアクセスできます。

ここで私が間違っていることを誰かに教えてもらえますか?

4

2 に答える 2

12

問題は、クラスとコンパニオン オブジェクトをそのようにネストできないことです。コンパニオン オブジェクトを定義するには、オブジェクトの本体の外側で同じファイル内にクラスを定義する必要があります。

于 2010-10-28T18:24:37.913 に答える
5

コンパニオン オブジェクトは、実際のオブジェクトを含むのではなく、実際のオブジェクトの隣に配置する必要があります。

object Example {
  class C(val i: Int = C.DefaultI) { }
  object C { protected val DefaultI = 5 }
}

scala> (new Example.C).i
res0: Int = 5

scala> Example.C.DefaultI
<console>:11: error: value DefaultI cannot be accessed in object Example.C
   Example.C.DefaultI

protectedまたは、キーワードのスコープを変更して、囲んでいるオブジェクトを含めることもできます。

object Example {
  def value = (new D).hidden
  class D(val i: Int = 5) {
    protected[Example] def hidden = i*i
  }
}

scala> Example.value
res1: Int = 25

ただし、ここでは、外部オブジェクトに内部クラスと同じ名前を付けるべきではありません。そうしないと、クラス内から参照するのに問題が生じます。

于 2010-10-28T18:40:51.860 に答える