在Scala中,面向對象的權限控制主要通過訪問修飾符來實現。Scala提供了以下幾種訪問修飾符來控制類、對象、成員變量和方法的訪問權限:
1.?默認訪問權限(無修飾符)
-
如果沒有指定任何訪問修飾符,成員默認是public的,即可以在任何地方訪問。
2.?private
?修飾符
-
private
?修飾的成員只能在定義該成員的類或對象內部訪問。 -
子類無法訪問父類的?
private
?成員。
class MyClass {private val secret = 42def printSecret(): Unit = {println(secret) // 可以訪問}
}val obj = new MyClass
// obj.secret // 錯誤:無法訪問 private 成員
obj.printSecret() // 輸出: 42
3.?protected
?修飾符
-
protected
?修飾的成員可以在定義該成員的類及其子類中訪問。 -
與 Java 不同,Scala 的?
protected
?成員不能在同一包的其他類中訪問。
class Parent {protected val value = 10
}class Child extends Parent {def printValue(): Unit = {println(value) // 可以訪問}
}val child = new Child
child.printValue() // 輸出: 10
// child.value // 錯誤:無法訪問 protected 成員
4.?private[this]
?修飾符
-
private[this]
?修飾的成員只能在當前實例中訪問,即使是同一個類的其他實例也無法訪問。 -
這種修飾符通常用于確保對象的封裝性。
class MyClass {private[this] val secret = 42def compare(other: MyClass): Boolean = {// this.secret == other.secret // 錯誤:無法訪問 other.secretthis.secret == 42 // 只能訪問當前實例的 secret}
}
5.?protected[this]
?修飾符
-
protected[this]
?修飾的成員只能在當前實例及其子類的實例中訪問。 -
與?
private[this]
?類似,但允許子類訪問。
class Parent {protected[this] val value = 10
}class Child extends Parent {def compare(other: Child): Boolean = {// this.value == other.value // 錯誤:無法訪問 other.valuethis.value == 10 // 只能訪問當前實例的 value}
}
6.?包級訪問權限
-
Scala 允許通過?
private[包名]
?或?protected[包名]
?來限制成員的訪問范圍。 -
這種修飾符允許成員在指定的包及其子包中訪問。
package com.example {class MyClass {private[example] val value = 42 // 只能在 com.example 包及其子包中訪問}
}package com.example.sub {class SubClass {def printValue(): Unit = {val obj = new com.example.MyClassprintln(obj.value) // 可以訪問}}
}
總結
-
private
:僅限類內部訪問。 -
protected
:類及其子類訪問。 -
private[this]
:僅限當前實例訪問。 -
protected[this]
:當前實例及其子類實例訪問。 -
包級訪問:通過?
private[包名]
?或?protected[包名]
?控制包內訪問權限。
Scala 的權限控制機制比 Java 更加靈活,能夠更好地支持封裝和模塊化設計。