scala – 构成独立特征
发布时间:2020-12-16 08:54:30 所属栏目:安全 来源:网络整理
导读:给出两个独立的特征: trait T1 { def x = 42}trait T2 { def x = 0} 如果我尝试定义一个混合在这两个特征中的类,如: class C extends T1 with T2 我收到编译器错误: error: overriding method x in trait T1 of type = Int;method x in trait T2 of type
给出两个独立的特征:
trait T1 { def x = 42 } trait T2 { def x = 0 } 如果我尝试定义一个混合在这两个特征中的类,如: class C extends T1 with T2 我收到编译器错误: error: overriding method x in trait T1 of type => Int; method x in trait T2 of type => Int needs `override' modifier class C extends T1 with T2 ^ one error found 现在假设T1和T2是独立开发的,因此没有覆盖,因为它们不会覆盖任何东西.那怎么可以定义C?像这样: class C extends T1 with T2 { override def x = super.x } ? 解决方法
这被称为
diamond problem.在Scala中有两种方法可以解决这个问题:
trait T1 { def x = 0 } trait T2 { def x = 42 } class C extends T1 with T2 { override def x = super.x } class D extends T2 with T1 { override def x = super.x } 如果你现在调用新的C().x,你会得到42,因为Scala使用你最后混合的特征的实现.新的D().x将顺便产生0.这意味着,为了解决钻石问题,您必须明确定义要使用的实现. 另一种方式如下: trait T { def x: Int } trait T1 extends T { override def x = 0 } trait T2 extends T { override def x = 42 } class C extends T1 with T2 对新C().x的调用仍然会产生42,因为T2是混合的最后一个特征.不同之处在于你不必在C中定义x. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |