2016-11-23 62 views
2

我需要覆盖隐含在特征中的对象 res。目的是在一个地方定义自定义含义(特征B)。 特征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

我发现http://grokbase.com/t/gg/scala-user/12ak3cacsm/how-do-i-override-and-select-a-base-method-from-two-conflicting-traits结束了链接到https://issues.scala-lang.org/browse/SI-1938 – Dylan

回答

3

混合两个不相关的特征是不可能的,这两个特征都包含具有相同标识符的成员。 Scala编译器无法解决在这种情况下哪个优先。由于类型AB是相关的,所以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 

既然你已经混合成ARes反正,假设A不难延长,因为Res必须实现任何其它未提及的抽象成员。