我正在为面向对象的设计课做作业,而且我遇到了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,但我不知道如何隐藏它,并且仍然可以在配对对象内部访问它。
谁能告诉我这里我做错了什么?
答案 0 :(得分:11)
问题是类和伴随对象不能像那样嵌套。要定义伴随对象,您需要在对象的主体外部但在同一文件中定义类。
答案 1 :(得分: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
但是在这里你不应该将外部对象命名为与内部类相同的东西,否则你将无法从类中引用它。