私はしばしばその継承を使用していないので、なぜそれが動作しないのか分かりません。保護されたメンバーと基本クラスの保護されたメンバーへのアクセス
基本密封されたクラス::私のプロジェクトでは、私は次のようなもの持って
sealed class TheRoot {
protected def some: String = "TheRoot"
}
をそして、それはいくつかのロジックを持つ子孫だ:
final case class Descendant() extends TheRoot {
def call: Unit = {
val self: TheRoot = this
self.some // <<- throw compilation error
}
}
上記のコンパイル私に次のエラーを与える:
error: method some in class TheRoot cannot be accessed in TheRoot
Access to protected method some not permitted because
prefix type TheRoot does not conform to
class Descendant where the access take place
self.some
私は実際に保護されている
sealed class TheRoot {
protected def some: String = "TheRoot"
}
object TheRoot {
final case class Descendant() extends TheRoot {
def call: Unit = {
val self: TheRoot = this
self.some // <<- NO ERROR!
}
}
}
// Exiting paste mode, now interpreting.
defined class TheRoot
defined object TheRoot
の保護されたメソッドにアクセスすることができますが、私は現在のオブジェクトの種類をアップキャストする必要があり、私の例を簡略化されています。あなたの引用では、 '保護されたメンバはクラスのサブクラスからしかアクセスできません。 'という質問があります。私には、' Descend'は 'TheRoot'のサブクラスです。私はコンパニオンオブジェクトの仕組みを知っていますが、なぜこのような場合に保護されたアクセスが許可されるのかはわかりません – 4lex1v
なぜ 'this'をスーパータイプにアップアップする必要がありますか?サブタイプを受け入れる任意の場所でサブタイプを使用することができます(もちろん、反変的な引数は除きます)...とにかく、保護されたメンバーを囲むパッケージ( 'protected [p] def some:String = ...')をスコープすることも必要ですあなたの例のように、 'Descend'をオブジェクトに囲んで動作させます。 – Sergey
@ 4lex1v申し訳ありませんが、私はあなたの質問を誤解しています。私は別の奇妙なことを見つけた。これは誰かが働くが、自己ではない – Jerry