2010-11-19 75 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

相關問題