2012-03-05 46 views
5

對不起,如果這是一個愚蠢的標題,我不知道該如何表達這顯然斯卡拉 - 通過自我類型註解類子對象

說,我有一個日誌特質:

trait Logging { 
    def log(s:String) 
} 

,然後一些實施

trait PrintlnLog extends Logging { 
    def log(s:String) { println(s) } 
} 

,我用這樣

class SomeProcess { this:Logging => 
    def doSomeJunk() { 
     log("starting junk") 
     ... 
     log("junk finished") 
    } 
} 

我可以使用這個類像

val p = new SomeProcess() with PrintLog 
p.doSomeJunk() 

現在如果我有這個

class SubProcess { this:Logging => 
    def doSubJunk() { 
     log("starting sub junk") 
     ... 
     log("finished sub junk") 
    } 
} 

class ComplexProcess { this:Logging => 
    def doMoreJunk() { 
     log("starting more junk") 
     val s = new SubProcess with // ??? <-- help! 
     s.doSubJunk() 
     log("finished more junk") 
    } 
} 
在ComplexProcess

我想實例化一個子過程中已經混入ComplexProcess相同的日誌特質的混合,但ComplexProcess不知道那是什麼。有沒有辦法得到它的參考?

回答

4

你不能那樣做。在這種情況下,你可能會這樣做:

trait WithSubProcess { 
    def s: SubProcess 
} 

class ComplexProcess { this: Logging with WithSubProcess ... } 
+0

這實際上就是我在做的事情,但它很醜,因爲我具有散佈在我的代碼中的所有這些特徵,其唯一目的是爲了記錄日誌。希望有更好的辦法 – dvmlls 2012-03-05 19:47:10

2

答案根據定義,不是。 Scala是一種靜態類型的語言,因此這些信息僅在編譯時纔可用。 Paolo提到,使用更廣泛的反射API和一些組合/組裝黑客可能在將來有可能實現,儘管這與Paolo提到的面向方面編程接近。