加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

什么是更多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,即使该类型被并入。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读