2010-11-23 182 views
6

在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地方,以便它可以从它的同伴的子类与其他类,包括在同一个包中的其他类访问,但不?

回答

8

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

这里,privateprotected无意义之间的差,由于对象Foo,这意味着不存在具有相同类作为对象FooFoo.type)的任何其他对象。

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

然而,在你的地方,我会回到设计委员会。

3

在这种情况下,我建议使用包专用改性剂,象下面这样:

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

值将仍然是其他人都在包装可见。

+3

只是一个小问题:你的子类并不总是在同一个包。 – Nicolas 2010-11-24 08:07:30

0

要达到同样的事情,一个解决这个问题可以是:

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