19

除了继承方面,以下类模板之间是否有区别:

1| trait TraitA extends TraitB

2| trait TraitA { self: TraitB => }

我想在和之间分配责任TraitATraitB但没有后者,前者就无法运作。

你会如何表达这个意图?对我来说,解决方案 [2] 将是更自然的方法。但是,我不想让实施者承担混合需要混合的内容。

4

1 回答 1

16

我的偏好通常是 [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

于 2011-08-30T22:44:49.720 回答