2014-07-09 27 views
1

是否有可能改變/添加行爲到一個靜態方法?我的意思是像AspectJ那樣添加/改變行爲(之前,之後)。我一直在使用Scala's Stackable Trait Pattern來改變像AspectJ這樣的類和特性的方法的行爲(但我沒有使用它或打算使用AspectJ,只是想模擬相同的功能),但這不適用於對象,因此,對於靜態方法也沒有)。你知道一種方法來使這項工作?預先感謝任何幫助/建議。如果您需要示例或其他內容,請告訴我。斯卡拉 - 改變/添加行爲到一個靜態方法

回答

-1

Scala並沒有真正的靜態方法。編譯器將創建靜態方法,但這些不是可見的語言功能。對於object,Scala爲Java互操作創建靜態方法,他們所做的只是調用單例實例上的相應方法。對於具有具體方法的特徵,Scala將這些方法編譯爲靜態方法,這些方法是從每個擴展特徵的類中創建的實例方法調用的。

爲了在object上使用AspectJ,必須給它一個該對象的類名稱。這可以是它在Scala中的任何名稱,但是會附加一個$List$List的伴隨對象的類名。要將AspectJ與特徵一起使用,請將$class附加到特徵名稱以獲取特徵的靜態方法所在的類。

+0

「對於具有具體方法的特徵,Scala將這些方法編譯爲靜態方法」,是指在伴隨對象中定義的方法,還是將特徵中的方法轉換爲靜態方法?(這樣,這些方法可以靜態地進行處理)。我不打算使用AspectJ,只想捕獲對象中定義的方法的調用,並在執行之前或之後添加一些內容。有了類和特性,你可以用Stackable Trait Pattern來做到這一點。我想你的答案唯一的解決方案是定義我想要的特質和(繼續下一個評論) –

+0

(繼續)的方法,並使用伴侶對象將其轉換爲靜態方法。不知道該模式是否可以工作,因爲我需要將擁有該方法的類與覆蓋它的行爲疊加在一起的類中,但該方法將從伴隨對象中調用,而不是該類的實例。所以沒有mixin可以完成。 –

+0

是的,特質中的具體方法成爲靜態方法。在我看來,你應該寫一個特質,並將其混合到伴侶對象中,而不是類本身,儘管更具體的例子可以幫助回答你的問題。 – wingedsubmariner