Scala保护对象
在Scala中,如果我创建了一个对象和伴生类,那么如果导入对象,则可以从类中访问使用Scala保护对象,scala,protected,Scala,Protected,在Scala中,如果我创建了一个对象和伴生类,那么如果导入对象,则可以从类中访问使用protected修饰符声明的标识符: object Foo { protected val X = 42 } class Foo { import Foo._ def getX(): Int = X } 但是,无法从Foo类的子类访问受保护的标识符: class Bar extends Foo { import Foo._ def getX(): Int = X * 2 } 我在Bar中
protected
修饰符声明的标识符:
object Foo {
protected val X = 42
}
class Foo {
import Foo._
def getX(): Int = X
}
但是,无法从Foo类的子类访问受保护的标识符:
class Bar extends Foo {
import Foo._
def getX(): Int = X * 2
}
我在Bar
中遇到编译时错误
除此之外(暗示)
public
,我是否可以在X
上放置任何访问修饰符,以便可以从其同伴的子类访问它,但不能从其他类访问它,包括同一包中的其他类?这是因为只有类Foo
是对象Foo
的同伴
这里,private
和protected
之间的区别毫无意义,因为对象Foo
是一个单态对象,这意味着没有任何其他对象具有与对象Foo
相同的类(Foo.type
)
Scala中的访问限制是基于包的,所以简短的回答是否定的。不过,您可以在基类上创建转发器,除非您需要它在没有实例的情况下可用
但是,在您的位置,我会回到设计板。在这种情况下,我建议使用包专用修改器,如下所示:
object Foo {
private[your_package] val X = 42
}
该值对包中的其他所有人仍然可见。要实现同样的效果,此问题的一个解决方案可以是:
class Bar extends Foo {
import Foo._
override def getX(): Int = super.getX * 2
}
只是一个小问题:您的子类并不总是在同一个包中。