2016-06-02 18 views
2

私はしばしばその継承を使用していないので、なぜそれが動作しないのか分かりません。保護されたメンバーと基本クラスの保護されたメンバーへのアクセス

基本密封されたクラス::私のプロジェクトでは、私は次のようなもの持って

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 

答えて

1

document

Access to protected members is also a bit more restrictive than in Java. In Scala, a protected member is only accessible from subclasses of the class in which the member is defined. In Java such accesses are also possible from other classes in the same package. In Scala, there is another way to achieve this effect, as described below, so protected is free to be left as is. The example shown illustrates protected accesses:

package p { 
    class Super { 
    protected def f() { println("f") } 
    } 
    class Sub extends Super { 
    f() 
    } 
    class Other { 
    (new Super).f() // error: f is not accessible 
    } 
} 

にdescripted通り:スーパークラスからのメンバー...しかし、我々はコンパニオンオブジェクトにそれをラップする場合、それはより興味深いなってきた、それは魔法のように問題を修正しますあなたのコードは、self.somesomeに変更しても問題ありません。

コンパニオンオブジェクトは、そのコンパニオンクラスの任意のメンバーにアクセスすることができ、そのオブジェクトTheRootの​​はsome

+0

の保護されたメソッドにアクセスすることができますが、私は現在のオブジェクトの種類をアップキャストする必要があり、私の例を簡略化されています。あなたの引用では、 '保護されたメンバはクラスのサブクラスからしかアクセスできません。 'という質問があります。私には、' Descend'は 'TheRoot'のサブクラスです。私はコンパニオンオブジェクトの仕組みを知っていますが、なぜこのような場合に保護されたアクセスが許可されるのかはわかりません – 4lex1v

+0

なぜ 'this'をスーパータイプにアップアップする必要がありますか?サブタイプを受け入れる任意の場所でサブタイプを使用することができます(もちろん、反変的な引数は除きます)...とにかく、保護されたメンバーを囲むパッケージ( 'protected [p] def some:String = ...')をスコープすることも必要ですあなたの例のように、 'Descend'をオブジェクトに囲んで動作させます。 – Sergey

+0

@ 4lex1v申し訳ありませんが、私はあなたの質問を誤解しています。私は別の奇妙なことを見つけた。これは誰かが働くが、自己ではない – Jerry

関連する問題