3

サンプルの scala コードを次に示します。

abstract class A(val x: Any) {  
    abstract def copy(): A  
}  

class b(i: Int) extends A(i) {  
    override def copy() = new B(x)  
}  

class C(s: String) extends A(s) {  
    override def copy() = new C(x)  
}  

//here's the tricky part  
Trait t1 extends A {  
    var printCount = 0  

    def print = {  
        printCount = printCount + 1  
        println(x)  
    }  

    override def copy = ???  
}  

Trait t2 extends A {  
    var doubleCount = 0  

    def doubleIt = {  
        doubleCount = doubleCount + 1  
        x = x+x  
    }  

    override def copy = ???  
}  

val q1 = new C with T1 with T2  
val q2 = new B with T2 with T1  

ご想像のとおり、ここで質問です。T1 と T2 にコピー メソッドを実装するにはどうすればよいでしょうか。それらが B、C、または t2/t1 と混在している場合、ワックスのボール全体のコピーを取得できますか? たとえば、q2.copy は T2 と T1 を持つ新しい B を返し、q1.copy は T1 と T2 を持つ新しい C を返す必要があります。

ありがとう!

4

3 に答える 3

3
于 2013-02-26T11:55:09.317 に答える
2

これが、ケースクラスの拡張が非推奨になる理由の1つです。そのためのコンパイラ警告が表示されるはずです。で定義されているコピーメソッドはA、または何かが存在する可能性があることをどのように知っている必要がありますTか?ケースクラスを拡張することにより、、、などequalsのメソッドを生成するときに、コンパイラが行ったすべての仮定を破ることができます。copytoString

于 2013-02-26T06:46:24.937 に答える
-1

最も簡単で簡単な答えは、具象型をケースクラスにすることです。copy次に、クラスのすべてのコンストラクターパラメーターの名前付きパラメーターを受け入れるコンパイラー提供のメソッドを取得して、新しい値を元の値と選択的に区別できるようにします。

于 2013-02-26T02:38:03.757 に答える