4

次の特性とその特性を拡張するクラスがあるとします

trait T { protected def f() }

class C extends T { def f(): println("!") }

object Main extends App {
    val c = new C
    c.f() // should be a compile error
}

の宣言のfようprotectedに宣言したTので、 のスコープ内から呼び出すことができますがC、他の人からは呼び出すことができません。つまり、C.f()コンパイルエラーになるはずです。protectedからの修飾子Tが引き継がれると思っていましたが、そうではありません。

C.f()の宣言のようprotectedに再宣言することもできCますが、繰り返す必要はありません。Scalaでこれを行う他の方法はありますか?

4

2 に答える 2

5

短い答え:いいえ。

アクセス修飾子を指定しないことは、「アクセス修飾子を継承する」という意味ではなく、「パブリック」を意味します。Scala にはpublicキーワードがなく、このように機能しない場合、オーバーライド時に保護されたメンバーを実際に公開する方法はありません。

つまり、protected修飾子を繰り返す必要があります。

于 2013-10-02T22:34:52.547 に答える