Scala保护对象

时间:2010-11-23 17:32:46

标签: scala protected

在Scala中,如果我创建了一个对象和伴随类,如果导入了对象,则可以从类中访问使用protected修饰符声明的标识符:

object Foo {
  protected val X = 42
}
class Foo {
  import Foo._
  def getX(): Int = X
}

但是,无法从类Foo的子类访问protected标识符:

class Bar extends Foo {
  import Foo._
  def getX(): Int = X * 2
}

我在Bar中收到编译时错误。

其他(隐含的)public,我可以在X上放置任何访问修饰符,以便可以从其伴随的子类访问它,但不能从其他类访问,包括其他类相同的包裹?

3 个答案:

答案 0 :(得分:8)

那是因为只有班级Foo是对象Foo的伴侣。

此处,privateprotected之间的差异毫无意义,因为对象Foo singleton ,这意味着没有任何其他对象与对象FooFoo.type)具有相同的类。

Scala中的访问限制是基于包的,因此简短的答案是否定的。但是,您可以在基类上创建转发器,除非您需要它在没有实例的情况下可用。

但是,在你的位置,我会回到设计委员会。

答案 1 :(得分:3)

在这种情况下,我建议使用包私有修饰符,如下所示:

object Foo {
  private[your_package] val X = 42
}

该包中的其他人仍然可以看到该值。

答案 2 :(得分:0)

为了达到同样的目的,这个问题的一个解决方案可以是:

class Bar extends Foo {
  import Foo._
  override def getX(): Int = super.getX * 2
}