Scala受保护的对象

8

在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个回答

9
那是因为只有类Foo与对象Foo相伴。

在这里,privateprotected之间的区别无意义,因为对象Foo是单例,这意味着没有其他对象具有与对象FooFoo.type)相同的类。

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

然而,在您的位置上,我会回到设计阶段。


3
在这种情况下,我建议使用包私有修饰符,如下所示:
object Foo {
  private[your_package] val X = 42
}

该值仍将对包中的其他人可见。


4
小问题:你的子类不总是在同一个包中。 - Nicolas

0
为了达到相同的目的,解决这个问题的一个方案可以是:
class Bar extends Foo {
  import Foo._
  override def getX(): Int = super.getX * 2
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接