Scala訪問修辭符
本章將介紹Scala訪問修飾符。包,類或對象的成員可以使用私有(private
)和受保護(protected
)的訪問修飾符進行標註,如果不使用這兩個關鍵字的其中一個,那麼訪問將被視爲公開(public
)的。這些修飾符限制了對某些代碼區域的成員訪問。要使用訪問修飾符,請將其關鍵字包含在包,類或對象的成員的定義中,我們將在下一節中看到。
私有成員
私有(private
)成員只能在包含成員定義的類或對象內部可見。
以下是示例代碼段解釋私有(private
)成員 -
class Outer {
class Inner {
private def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // Error: f is not accessible
}
在Scala,訪問(new Inner). f()
是非法的,因爲f
在Inner
類中聲明爲private
,並且訪問不在Inner
類內。 相比之下,第一次在「InnerMost」
類中訪問f()
是可以的,因爲該訪問包含在Inner
類的主體中。在Java中也允許這樣的兩個訪問,因爲它允許外部類訪問其內部類的私有成員。
受保護的會員
受保護(protected
)成員只能從定義成員的類的子類訪問。以下是說明受保護(protected
)成員的示例代碼片段 -
package p {
class Super {
protected def f() { println("f") }
}
class Sub extends Super {
f()
}
class Other {
(new Super).f() // Error: f is not accessible
}
}
在Sub
類中訪問f
是可行的,因爲f
被聲明爲在Super
類中被保護,Sub
類是Super
的子類。 相反,不允許訪問Other
類中的f()
方法,因爲Other
類不會從Super
類繼承。在Java中,後者的訪問將仍然允許,因爲Other
類與Sub
類在同一個包中。
公有成員
不同於私有和受保護的成員,不需要爲公有成員使用Public
關鍵字指定。沒有明確使用修飾符則自動歸爲公共成員。 這些成員可以從任何地方訪問。
以下是解釋公共成員的示例代碼片段 -
class Outer {
class Inner {
def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // OK because now f() is public
}
保護作用域
Scala中的訪問修飾符可以通過限定符進行擴充。形式爲private [X]
或protected [X]
的修飾符表示爲訪問是私有或受保護的「最多」到X,其中X指定一些封閉的包,類或單例對象。
考慮以下示例 -
package society {
package professional {
class Executive {
private[professional] var workDetails = null
private[society] var friends = null
private[this] var secrets = null
def help(another : Executive) {
println(another.workDetails)
println(another.secrets) //ERROR
}
}
}
}
注意 - 以下幾點來自上面的例子總結 -
- 變量:
workDetails
在封閉包professional
中的任何類中可訪問。 - 封閉包:
friends
的任何類都可以被society
包中任何類訪問。 - 變量:
secrets
只能在實例方法的隱式對象(this
)中訪問。