除了继承方面之外,以下类模板之间是否有区别:
1| trait TraitA extends TraitB
2| trait TraitA { self: TraitB => }
我想在 TraitA
和 TraitB
之间分配职责,但如果没有后者,前者就无法运行。
您将如何表达此意图?对我来说,解决方案 [2] 将是更自然的方法。然而,无论如何,我不想给实现者带来混合需要混合的负担。
最佳答案
我的偏好通常是[1],因为正如您所说,实现者没有负担混合TraitB
(的子类型)。如果出于某种原因,希望不继承TraitB
中的具体实现并强制实现者在子类型中做出选择,那么也许[2]更可取。 特征B
。尽管如此,[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
用作B
,即使尽管类型已合并。
关于scala - 还有什么是Scala惯用: trait TraitA extends TraitB or trait TraitA { self: TraitB => },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250374/