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()是非法的,因為fInner類中宣告為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)中存取。