2010-11-23 12 views
6

Scala保護オブジェクト

ただし、protectedの識別子には、オブジェクトのクラスからアクセスすることはできません。クラスFoo:

class Bar extends Foo { 
    import Foo._ 
    def getX(): Int = X * 2 
} 

Barでコンパイル時エラーが発生しました。

publicそれ以外の(暗黙の) publicX上に置くことができるアクセス修飾子はありますか?そのコンパニオンのサブクラスからアクセスできますが、同じパッケージの他のクラスを含む他のクラスからはアクセスできません。

答えて

8

これは、クラスFooがオブジェクトFooに匹敵するからです。オブジェクトFooのでここ

privateprotected無意味との差は、オブジェクトFooFoo.type)と同じクラスを有する任意の他のオブジェクトが存在しないことを意味シングルトン、です。

Scalaでのアクセス制限はパッケージベースなので、短い答えはいいえです。ただし、インスタンスなしで利用できるようにする必要がない場合は、基本クラスでフォワーダを作成することもできます。

あなたの場所では、私はデザインボードに戻ります。

3

このような場合には、私は以下のように、パッケージprivate修飾子を使用することをお勧めします:

object Foo { 
    private[your_package] val X = 42 
} 

値はまだ、パッケージ内の他のみんなに見えるようになります。

+3

だけ小さな問題:あなたのサブクラスは、同じパッケージに常にではありません。 – Nicolas

0

同じことを達成するために、この問題に対する一つの解決策は、使用できます

class Bar extends Foo { 
    import Foo._ 
    override def getX(): Int = super.getX * 2 
}