Scala-access-modifiers

提供:Dev Guides
移動先:案内検索

Scala-アクセス修飾子

この章では、Scalaアクセス修飾子について説明します。 パッケージ、クラス、またはオブジェクトのメンバーには、アクセス修飾子privateおよびprotectedのラベルを付けることができます。これら2つのキーワードのいずれも使用していない場合、アクセスはパブリックと見なされます。 これらの修飾子は、メンバーへのアクセスを特定のコード領域に制限します。 アクセス修飾子を使用するには、次のセクションで説明するように、パッケージ、クラス、またはオブジェクトのメンバーの定義にそのキーワードを含めます。

プライベートメンバー

プライベートメンバーは、メンバー定義を含むクラスまたはオブジェクト内でのみ表示されます。

以下は、プライベートメンバーを説明するためのサンプルコードスニペットです-

class Outer {
   class Inner {
      private def f() { println("f") }

      class InnerMost {
         f()//OK
      }
   }
   (new Inner).f()//Error: f is not accessible
}

Scalaでは、アクセス(新しい内部)。 fはInnerでprivateと宣言されており、アクセスはInnerクラス内からではないため、f()は不正です。 対照的に、Innermostクラスのfへの最初のアクセスはOKです。そのアクセスは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
   }
}

fが「スーパー」クラスで保護されていると宣言され、「サブ」クラスがスーパーのサブクラスであるため、クラスSubのfへのアクセスは問題ありません。 対照的に、クラス「その他」はクラス「スーパー」から継承しないため、「その他」クラスのfへのアクセスは許可されません。 Javaでは、「その他」クラスは「サブ」クラスと同じパッケージにあるため、後者のアクセスは引き続き許可されます。

公開メンバー

プライベートメンバーや保護メンバーとは異なり、パブリックメンバーにパブリックキーワードを指定する必要はありません。 パブリックメンバーには明示的な修飾子はありません。 そのようなメンバーには、どこからでもアクセスできます。

以下は、パブリックメンバーを説明するためのサンプルコードスニペットです-

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は、パッケージの専門家内のどのクラスからもアクセスできます。
  • 多様な友人は、包囲するパッケージ社会内のどのクラスからもアクセスできます。
  • 可変シークレットは、インスタンスメソッド内の暗黙オブジェクト(this)でのみアクセス可能です。