Scala - 訪問修飾符



本章將引導您瞭解 Scala 的訪問修飾符。包、類或物件的成員可以使用訪問修飾符 `private` 和 `protected` 進行標記,如果我們沒有使用這兩個關鍵字中的任何一個,則訪問將被假定為 `public`。這些修飾符將對成員的訪問限制在程式碼的特定區域。要使用訪問修飾符,您需要在其關鍵字包含在包、類或物件的成員定義中,如下節所示。

私有成員

私有成員僅在其包含成員定義的類或物件內部可見。

以下程式碼片段示例解釋了私有成員:

示例

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 中宣告為私有,並且訪問並非來自 Inner 類內部。相反,在 Innermost 類中第一次訪問 f 是可以的,因為該訪問包含在 Inner 類的主體中。Java 將允許這兩種訪問,因為它允許外部類訪問其內部類的私有成員。

受保護成員

受保護成員只能從定義成員的類的子類訪問。

以下程式碼片段示例解釋了受保護成員:

示例

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,其中 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) 內的隱式物件中訪問。

廣告