2011-08-19 90 views
2

我想知道是否有一個實例在運行時添加到特徵中,可以將特徵從實例中刪除,因此它可以像最初一樣運行。有沒有辦法從Scala中的實例中刪除特質?

+4

您不能在運行時添加特徵。所以我不確定你在問什麼。 –

+1

你可以給你一個例子,說明你在運行時將一個特徵添加到一個實例嗎?我問,因爲,據我所知,性狀只能在編譯時混合使用。有關它如何在JVM級別工作的詳細信息,請參閱此答案:http://stackoverflow.com/questions/7057166/how-does-the-scala-compiler-handle-concrete-trait-methods/7057723#7057723 –

+3

他是大概想着「新Foo與酒吧」。這種模式看起來像一個動態混合,但它都是靜態的。它只是創建一個將Bar與Foo混合的匿名類。 –

回答

3

這是不可能的。該實例屬於特徵代碼所屬的類。

如果JVM支持「class + traits」之類的東西,那麼理論上可以恢復它。

4

在編譯時將特徵與類組合在一起。所以在運行時不可能添加/刪除特徵。

對於你的具體情況,考慮增加一個方法到類:

class Foo(val a: Object, val b: Object, ...) { 
    def original() = new Foo(a, b, ...) 
} 

然後就可以調用instance.original()找回未受到任何特質的對象的副本。

+0

這是一個好主意,但只有當這個類是不可變的。 – 01es

相關問題