Scala-access-modifiers
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)でのみアクセス可能です。