2017-06-23 18 views
0

混合假设以下情况如何获得隐性和显性相同的值对齐时,无论是在

  • 我有一个性状A和性状B,这两个声明具有相同的名称和类型的值。

  • A定义的值明确,而B定义它隐含

  • A和B是从外部库,并且不能被改变。我不想分叉。

  • 我想在C类是在我自己的代码来使用这两者

我怎样才能让他们的C类里面对齐? 我想B.foo从A.foo值

// External code, cant touch 
trait A{ 
    val foo = "boom" 
} 
trait B{ 
    implicit val foo: String 
} 

// My class 
class C extends A with B { 
    //uh oh?? 
} 

更新(从碧玉-M帮助)

// External code, cant touch 
trait A{ 
    val foo = "boom" 
} 
trait B{ 
    implicit val foo: String 

    def implBang()(implicit s: String) = s 

    def doTheBang() = implBang() 
} 

// My class 
class C extends B with A {} 

new C().doTheBang; // Prints "boom" 

现在唯一的问题剩下的,我怎么才能富来在C类的隐式范围内?

+0

究竟是什么问题?如果你不希望'foo'隐含在'C'中,那么'C类扩展A和B'就可以。 –

+0

A给了我一个foo,而B需要一个隐式定义。但是,因为他们有相同的名称,我不知道我可以如何指定A.foo的值到B.foo? – RoyB

+0

C类中只有一个'foo'将A扩展为B',它的值为''ok“'。从“B”的角度来看,“foo”是隐含的。从“C”或“A”看,这并不是隐含的。 –

回答

2

理想情况下,你可以选择你想要super[Name]实施。但对于不起作用的vals for some reason

class C extends A with B { 
    override implicit val foo = super[A].foo 
    // error: super may not be used on value foo 
} 

所以,如果你真的需要在C一些隐含String我建议只是让线性做它的事,并定义另一个隐含的VAL。

class C extends A with B { 
    implicit val bar = foo 
} 
+0

谢谢,真的有帮助! – RoyB

0

你可以只覆盖implicit变量,如:

// My class 
class C extends A with B { 
    override implicit val foo = "My Value" 
} 
+0

好,但现在如何从特质A中获得价值? 重写隐式val foo = foo does not work – RoyB