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: error: 方法 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 回答