2011-07-26 12 views
4

私は内部クラスメソッドと呼ばれる関数で使用される暗黙のパラメータを取るクラスを持っています。暗黙のパラメータをオーバーライドし、クラスとその継承された親クラスの両方に、同じ新しい暗黙オブジェクトへの参照を持たせたいと考えています。scala:親クラスと子クラスの両方でコンストラクタ内の暗黙的な変数をオーバーライドしますか?

親を暗黙にvarに設定し、それを新しい値に設定すると、親で暗黙的に上書きされますが、子では無効になります。

(オーバーライド子クラスと親クラスの両方に影響を与える追加の制限がある以外は、これは、scala: override implicit parameter to constructorと同様である。)例えば

:次いで

def outside(implicit x: Boolean) { 
    println(x) 
} 

class Parent(implicit var x: Boolean) { 
    def setImplicit() { 
    x = true 
    } 

    def callOutside { 
    outside 
    } 
} 

class Child(implicit x: Boolean) extends Parent { 
    override def callOutside { 
    outside 
    } 
} 

と:

scala> val a = new Parent()(false) 
a: Parent = [email protected] 

scala> a.callOutside 
false 

scala> a.setImplicit() 

scala> a.callOutside 
true // <-- sees the new implicit correctly 


scala> val b = new Child()(false) 
b: Child = [email protected]8331dd0 

scala> b.callOutside 
false 

scala> b.setImplicit() 

scala> b.callOutside 
false // <-- wrong, desire "true" instead 

希望の動作を得る方法はありますか?親と子の暗黙の両方をvarとするようなことをすることはうまくいかないようです。ありがとう!

答えて

1

あなたが本当にクラス・パラメータを必要としなかった場合だけ

class Parent(x0: Boolean) { 
    implicit var x = x0 
    ... 
} 

暗黙的にすることができました。私はあなたがしていると仮定します。

もう1つの方法は、コンパニオンオブジェクトにインプリシットを入れることです。

class Parent(x0: Boolean) { 
    implicit var x = x0 
    def setImplicit { x = true } 
    def outsideCall { outside } 
} 
object Parent { 
    def apply(implicit x: Boolean) = new Parent(x) 
} 

class Child(x0: Boolean) extends Parent(x0) { 
    def callOutside { outside } 
} 
object Child { 
    def apply(implicit x: Boolean) = new Child(x) 
} 

また、あなたは(それが暗黙的で曖昧ではありませんので、いくつかの方法で装飾)子どものための民間の主なコンストラクタを作成し、セカンダリコンストラクタで暗黙的に使用することができます:

class Child private (b: Boolean, u: Unit) extends Parent()(b) { 
    def this()(implicit x: Boolean) = this(x,()) 
    def callOutside { outside } 
} 
ので、同様
関連する問題