在运行时向类添加特定Trait

时间:2010-11-19 10:43:22

标签: scala

我有一些特征“Foo”有一些方法。我想把这个特性混合到任何一个班级。但我不想写像

这样的东西
val b = new Bar with Foo

我需要的东西就像我只是传递一个类而且它与Foo混合在一起。我想混合这个特性,即固定所有类只应与Foo特征混合。

val b = new Factory(Bar) //Factory returns instance with trait Foo

我发现了post,但我不相信。

scala可能会出现这样的事情吗?

1 个答案:

答案 0 :(得分:4)

目前最好的解决方案是实现Foo这样的事情:

class Foo(bar:Bar) {
    ...
}
object Foo {
    def apply(bar:Bar) = new Foo(bar)
    implicit def backToBar = this.bar
}

然后将其用作

val foo = Foo(myBar)

对于FooBar之间共享的任何方法名称,将使用Foo中的版本(与mixin中的重载一样)。任何其他方法,都将使用Bar上的变体。

这项技术并不完美,Bar中的方法只会调用Bar中定义的其他方法,而不会调用Foo中定义的“重载”。否则,它非常接近您的需求。