|
|
Scala沒有public關鍵字,在Scala中,沒有使用任何存取修飾的類別成員(不加private也不加protected),就是公開成員(不包括類別參數,類別參數預設是private[this] val),例如:class Some {如果定義成員時,使用protected,則表示該成員僅讓繼承後的子類別內部來使用(如果你熟悉Java,請注意,protected在Scala中沒有套件存取的權限): class Some {如果定義成員時,使用private,就僅可在類別內部使用,或者同一類別的實例,在類別內部可以透過實例來使用(如果你熟悉Java,請注意,Java中,外部類別可以直接存取內部類別的private成員,但Scala不行),例如: class Outer {protected或private存取修飾可以加上量詞(Qualifier),語法為private[X]或protected[X],X可以是類別、套件或單例物件,這表示權限修飾到X的範圍。 舉個例子來說,下面這個可以通過編譯: class Some {如果你要更嚴格的修飾,讓x完全無法透過實例存取,則可以使用private[this],這表示私有化至this實例本身才可以存取,也就是所謂物件私有(Object-private),例如以下就通不過編譯了: class Some {私有化至this實例本身才可以存取,就是說,該成員完全僅可在類別內部使用,所以編譯錯誤的訊息為: error: value x is not a member of this.Some def doSome(s: Some) = s.x + x ^ 伴侶類別與伴侶物件預設彼此可以互相存取私有成員,例如: class Some {但下面這個會編譯錯誤: class Some {錯誤訊息如下: error: value x is not a member of this.Some def doSome(s: Some) = s.x + x ^ 下面這個也會編譯錯誤: class Some {錯誤訊息如下: error: value y is not a member of object this.Some def minus = Some.y - 1 ^ 在Scala中,protected並沒有套件範圍存取權限,這是因為你可以使用量詞修飾,達到套件存取權限的作用,例如,以下通不過編譯: package cc.openhome 由於protected沒有套件存取權限,所以編譯錯誤的訊息為: error: value x cannot be accessed in cc.openhome.Some def get = s.x ^ 但以下就可以編譯成功,因為你使用量詞修飾protected範圍至指定的套件層級,也就是所謂套件私有(Package-private): package cc.openhome 你不僅可以指定至openhome套件,你可以指定任何一層套件,例如: package cc.openhome 再看看先前的例子,原先通不過編譯: class Outer {編譯錯誤的訊息為: error: value x cannot be accessed in Outer.this.Inner (new Inner).x ^ 你可以指定private防護層級至外部類別,也就是所謂類別私有(Class-private)(讓外部類別可以存取內部類別的private成員,也就是如同Java的作法),例如以下可以通過編譯: class Outer {總而言之,private、protected看似可修飾的權限很少,但加上private[X]、protected[X],就可以讓你指定更細部的權限控制。 |