8

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

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

但是,protected不能从 Foo 类的子类访问标识符:

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

我在Bar.

除此之外(隐含)public,是否有任何访问修饰符我可以放置,X以便可以从其同伴的子类访问它,但不能从其他类访问,包括同一包中的其他类?

4

3 回答 3

9

那是因为只有类Foo是对象的伴侣Foo

private在这里,和没有意义的区别protected,因为对象Foo是一个单例,这意味着没有任何其他对象与对象FooFoo.type)具有相同的类。

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

然而,在你的位置,我会回到设计委员会。

于 2010-11-23T18:10:57.557 回答
3

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

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

该值仍然对包中的其他所有人可见。

于 2010-11-23T20:42:18.697 回答
0

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

class Bar extends Foo {
  import Foo._
  override def getX(): Int = super.getX * 2
}
于 2014-07-02T06:29:50.640 回答