我需要覆盖隐含在对象 res 中的一个隐藏一个特征的特征。目的是在一个地方定义自定义含义(特质B )。 Trait a 在外部库中定义。有可能吗?
trait t {
}
object m extends t
object q extends t
trait a {
implicit val o: t = m
}
trait b {
implicit val o: t = q
}
trait c {
def action(implicit v: t): Unit = {}
}
object res extends c with a with b {
//i need smth like override val o = super[b].o
val ololo= action
}
答案 0 :(得分:3)
不可能混合两个不相关的特征,这两个特征都包含具有相同标识符的成员。在这种情况下,Scala编译器无法解决哪一个优先。由于类型B
和o
是相关的,B
甚至不需要在两者中都具有相同的类型。特征A
需要延长o
并覆盖trait T
case object M extends T
case object Q extends T
trait A {
implicit val o: T = M
}
trait B extends A {
override implicit val o: T = Q
}
trait C {
def action(implicit v: T): Unit = println(v)
}
object Res extends C with B {
def call() = action
}
scala> Res.call()
Q
。没有任何其他方法可以在不使用继承的情况下覆盖成员。
A
由于您已将Res
混合到A
中,因此假定Res
不难扩展,因为{{1}}必须实施任何其他未提及的抽象成员。