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

这就是为什么不推荐扩展案例类的原因之一。你应该得到一个编译器警告。中定义的复制方法应该如何A知道也可能存在 aT或其他?通过扩展 case 类,您打破了编译器在生成和等方法equals时所做的所有假设。copytoString

于 2013-02-26T06:46:24.937 回答
-1

最简单和最简单的答案是将您的具体类型变成案例类。然后,您将获得编译器提供的copy方法,该方法接受所有类的构造函数参数的命名参数,因此您可以有选择地将新值与原始值区分开来。

于 2013-02-26T02:38:03.757 回答