2010-11-23 180 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 
}