2010-11-19 63 views
3

我有一些特征“Foo”,并带有一些方法。我想把这个特点混合到任何一个班级。但我不想写类似的东西在运行时将特定特征添加到类

val b = new Bar with Foo 

我需要类似的地方,我只是通过一个类,它与Foo混合。我只想与这个特征混合在一起,即所有类别只与Foo特征混合是固定的。我发现这个post但我不相信。

在scala中可以这样做吗?

+0

您是否在该工厂示例中传递_type_“Bar”或“Bar”的_instance_?如果是后者,这是不可能的,尽管隐式转换通常是足够的。 – 2010-11-19 20:15:29

+0

作为一个类型'酒吧' – 2010-11-22 09:52:52

回答

4

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

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

然后用它作为

val foo = Foo(myBar) 

对于在FooFooBar,版本之间共享的任何方法名将被使用(就像在mixin中重载一样)。任何其他方法,将使用Bar的变体。

该技术并不完美,Bar中的方法只会调用Bar中定义的其他方法,并且决不会在Foo中定义的“过载”。否则,它非常接近您的需求。

+0

我是新来的斯卡拉,但上面的代码在交互式斯卡拉壳无法正常工作,其他的事情吧是可变的,即它可以(酒吧与Foo)或(嘘与Foo),我没有得到上面的代码,它究竟做了什么 – 2010-11-22 11:11:48