什么是更多Scala惯用语:trait TraitA扩展TraitB或trait TraitA
发布时间:2020-12-16 09:38:40 所属栏目:安全 来源:网络整理
导读:除了继承方面,以下类模板之间有区别吗? 1| trait TraitA extends TraitB2| trait TraitA { self: TraitB = } 我想分担TraitA和TraitB之间的责任,但是前者在没有后者的情况下就不能运行。 你会如何表达这个意图?对我来说,解决方案[2]将是更自然的方法。
除了继承方面,以下类模板之间有区别吗?
1| trait TraitA extends TraitB 2| trait TraitA { self: TraitB => } 我想分担TraitA和TraitB之间的责任,但是前者在没有后者的情况下就不能运行。 你会如何表达这个意图?对我来说,解决方案[2]将是更自然的方法。不过,我不想把实施者的负担混合在需要混合的任何地方。 解决方法
我的偏好一般是[1],因为正如你所说,实施者不负责混合(一个子类型的)TraitB。如果由于某种原因,最好不要继承TraitB中的具体实现,并强制实施者在TraitB的子类型中进行选择,那么也许[2]更可取。尽管如此,[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,即使该类型被并入。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |