8

Scala では、オブジェクトとコンパニオン クラスを作成すると、オブジェクトがインポートされている場合、修飾子で宣言された識別子protectedにクラスからアクセスできます。

object Foo {
  protected val X = 42
}
class Foo {
  import Foo._
  def getX(): Int = X
}

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

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

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

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

4

3 に答える 3

9

これは、クラスだけがFooobject の仲間であるためFooです。

privateここで、との違いは意味がありません。protectedオブジェクトFoosingletonFooであるため、 object ( )と同じクラスを持つオブジェクトは他にないことを意味しますFoo.type

Scala でのアクセス制限はパッケージ ベースであるため、簡単に言えばノーです。ただし、インスタンスなしで使用できるようにする必要がない限り、基本クラスでフォワーダーを作成できます。

ただし、あなたの代わりに、私はデザイン ボードに戻ります。

于 2010-11-23T18:10:57.557 に答える
3

そのような場合、以下のようにパッケージのプライベート修飾子を使用することをお勧めします。

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

値は、パッケージ内の他のすべてのユーザーに引き続き表示されます。

于 2010-11-23T20:42:18.697 に答える
0

同じことを達成するには、この問題の 1 つの解決策は次のとおりです。

class Bar extends Foo {
  import Foo._
  override def getX(): Int = super.getX * 2
}
于 2014-07-02T06:29:50.640 に答える