除了继承方面,以下类模板之间是否有区别:
1| trait TraitA extends TraitB
2| trait TraitA { self: TraitB => }
我想在和之间分配责任TraitA
,TraitB
但没有后者,前者就无法运作。
你会如何表达这个意图?对我来说,解决方案 [2] 将是更自然的方法。但是,我不想让实施者承担混合需要混合的内容。
除了继承方面,以下类模板之间是否有区别:
1| trait TraitA extends TraitB
2| trait TraitA { self: TraitB => }
我想在和之间分配责任TraitA
,TraitB
但没有后者,前者就无法运作。
你会如何表达这个意图?对我来说,解决方案 [2] 将是更自然的方法。但是,我不想让实施者承担混合需要混合的内容。
我的偏好通常是 [1],因为正如您所说,实施者没有负担混入 (a sub-type of) 的负担TraitB
。如果出于某种原因不希望继承其中的具体实现TraitB
并强制实现者在TraitB
. 尽管如此,[1] 也同样灵活。
我倾向于仅在必要时使用 [2],例如当类型不是已知的类或特征时,
// Here, Matrix cannot extend type parameter Repr
trait Matrix[+Repr <: Matrix[Repr]] { self: Repr =>
...
}
更新。这是另一个小区别,
trait B
trait A { self: B => }
def g(ab: A): B = ab // Type mismatch: found A, required B
它是有点烦人 即使合并了类型,也不能A
用作 a的可选限制。B