2012-03-05 6 views
5

siento si eso es un título tonto, no sé cómo expresar esto claramenteScala - pass clase anotada tipo auto al objeto secundario

decir que tengo un rasgo de registro:

trait Logging { 
    def log(s:String) 
} 

y luego alguna aplicación

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

que utilizo como esto

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

que podría utilizar esta clase como

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

Ahora lo que si tengo este

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

en ComplexProcess quiero crear una instancia de una mezcla en el mismo rasgo de registro que se ha mezclado en ComplexProcess subproceso, pero ComplexProcess no sabe qué es eso. ¿Hay alguna forma de obtener una referencia?

Respuesta

4

No puede hacer eso. En este caso, probablemente haga algo como esto:

trait WithSubProcess { 
    def s: SubProcess 
} 

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

esto es esencialmente lo que estoy haciendo, pero es feo porque tengo todos estos rasgos diseminados a lo largo de mi código cuyo único propósito es el registro en tarta. esperaba que hubiera una mejor manera – dvmlls

1

El registro es un caso típico para la Programación Orientada a Aspectos. Puede intentar usar AspectJ con scala: vea this article by Jonas Boner

2

La respuesta es, por definición, no. Scala es un lenguaje de tipo estático, por lo que esta información solo está realmente disponible en tiempo de compilación. Con una API de reflexión más extensa y algunos hacks de composición/ensamblaje, podría ser posible en el futuro, aunque eso está manejando peligrosamente cerca de la Programación Orientada a Aspectos, como mencionó Paolo.

Cuestiones relacionadas