Latest web development tutorials

Scalaのアクセス修飾子

スカラ座とJavaアクセス修飾子、それぞれ、基本のように:パブリック、保護、プライベート。

あなたは、デフォルトでは、アクセス修飾子の文字を指定しない場合は、アクセスレベルScalaのオブジェクトは、公開されています。

プライベートでのScalaの修飾子は、Javaのより厳しい、ネストされたクラスの場合には、外側のクラスがあってもクラスのアクセスプライベートメンバー入れ子にすることはできません。


プライベート(非公開)のメンバー

privateキーワードで修飾し、このマークの付いたメンバーは内部でのみ可視定義されたクラスやオブジェクトのメンバを含む、同じルールも内部クラスに適用されます。

class Outer{
    class Inner{
    private def f(){println("f")}
    class InnerMost{
        f() // 正确
        }
    }
    (new Inner).f() //错误
}

fはプライベートとして宣言されているため(新インナー)の.f()のアクセスは内部では合法ではありませんが、アクセスが内部のカテゴリ内ではありません。

アクセスFが、この訪問は、クラス内に含まれているので問題は、最も内側ではありません。

それは内部クラスの外部クラスへのアクセスプライベートメンバーを可能にするためにJavaは、両方へのアクセスが許可されています。


保護(プロテクト)のメンバー

Scalaで、アクセス保護(プロテクト)メンバーは、Javaよりも厳しいです。 それが唯一のサブクラスのメンバーの保護はクラスのメンバで定義されていることができますのでアクセスされます。 Javaでは、クラスのサブクラスの定義に加えて、他のクラスのパッケージを使用して、メンバーにアクセスすることができ、キーワード保護された修正されたメンバーを使用することもアクセスすることができます。

package p{
class Super{
    protected def f() {println("f")}
    }
	class Sub extends Super{
	    f()
	}
	class Other{
		(new Super).f() //错误
	}
}

fはスーパーで保護として宣言されているため、上記の例では、アクセスのサブタイプは、fに対する問題ではありませんが、スーパーサブがサブクラスです。 スーパーから継承された他がないのでこれとは対照的に、他のは、Fへのアクセスが許可されていません。 後者は、ためにも、同じ袋に他のサブで、Javaで認識されている間。


公共(パブリック)メンバー

あなたは、任意の修飾子を指定しない場合はScalaは、デフォルトはpublicです。 このようなメンバーがどこでもアクセスすることができます。

class Outer {
   class Inner {
      def f() { println("f") }
      class InnerMost {
         f() // 正确
      }
   }
   (new Inner).f() // 正确因为 f() 是 public
}

保護範囲

スカラ、アクセス修飾子は、修飾子を使用して強調することができます。 形式は次のとおりです。

private[x] 

或 

protected[x]

xは、パッケージを参照する場合は、クラスまたはシングルトンオブジェクトに属します。 [x]はプライベートで書かれている場合は、[...]のメンバーに加えて、またはクラスに」をお読み[...]クラスのパッケージとその関連する画像では見え外側に、他のすべてのクラスのプライベートです。

このテクニックは、あなたのプロジェクトの可視外部顧客にいくつかのサブパッケージを定義することができますが、プロジェクトは常に目に見えないものを持ってパッケージで大規模なプロジェクトの数全体に有用です。

package bobsrocckets{
    package navigation{
        private[bobsrockets] class Navigator{
         protected[navigation] def useStarChart(){}
         class LegOfJourney{
             private[Navigator] val distance = 100
             }
            private[this] var speed = 200
            }
        }
        package launch{
        import navigation._
        object Vehicle{
        private[launch] val guide = new Navigator
        }
    }
}

上記の例では、クラスNavigatorはプライベートとしてマークされている[bobsrockets】すなわち、パッケージに含まれるすべてのクラスとオブジェクトのクラスが見えるbobsrocketsです。

対象車両は、パッケージの発売に含まれているためbobsrockets発射パッケージで、逆に、パッケージbobsrockets外のすべてのコードは、クラスナビゲーターにアクセスすることができるのに対し、例えば、車両からナビゲータ内のオブジェクトへのアクセスは、許可されています。