在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
上放置任何访问修饰符,以便可以从其伴随的子类访问它,但不能从其他类访问,包括其他类相同的包裹?
答案 0 :(得分:8)
那是因为只有班级Foo
是对象Foo
的伴侣。
此处,private
和protected
之间的差异毫无意义,因为对象Foo
是 singleton ,这意味着没有任何其他对象与对象Foo
(Foo.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
}