2012-03-05 6 views
5

scusate se questo è un titolo stupido, non so come esprimere chiaramentescala - pass tipo di auto di classe annotata in oggetto figlio

dire che ho un tratto di registrazione:

trait Logging { 
    def log(s:String) 
} 

e poi alcuni attuazione

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

che uso simili

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

potrei usare questa classe come

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

ora cosa succede se ho questo

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") 
    } 
} 

in ComplexProcess voglio istanziare un sottoprocesso mescolando nello stesso tratto di registrazione che è stato mescolato in ComplexProcess, ma ComplexProcess non sa cosa sia. c'è un modo per ottenere un riferimento ad esso?

risposta

4

Non puoi farlo. In questo caso, probabilmente dovresti fare qualcosa del genere:

trait WithSubProcess { 
    def s: SubProcess 
} 

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

questo è essenzialmente quello che sto facendo, ma è brutto perché ho tutti questi tratti sparsi per tutto il mio codice il cui unico scopo è quello di inserire il logging. speravo che ci fosse un modo migliore – dvmlls

1

La registrazione è un caso tipico per la programmazione orientata agli aspetti. Puoi provare ad usare AspectJ con scala: vedi this article by Jonas Boner

2

La risposta è, per definizione, no. Scala è un linguaggio tipizzato staticamente, quindi questa informazione è disponibile solo al momento della compilazione. Con una più ampia API di riflessione e alcuni hack di composizione/assemblaggio potrebbe essere possibile in futuro, anche se ciò sta guidando pericolosamente vicino ad Aspect Oriented Programming, come ha detto Paolo.

Problemi correlati