2012-02-16 16 views
6

I tienen el siguiente código:Scala - mezcla en un rasgo con sus importaciones (importaciones que heredan)

trait A { 
    import org.somepackage.C._ 
} 

class B extends A { 
    def getValue = value 
       ^^^^^ 
} 

object C { 
    var value = 5 
} 

El valor en la clase B no es visible lo que significa que la importación inherente de clase A no fue heredado por B, aunque el value es perfectamente visible dentro de A. ¿Cómo lograr el efecto de heredar también las importaciones para poder evitar importar explícitamente las mismas cosas en múltiples clases donde se mezcla el rasgo A?

+1

Posible duplicado de [En Scala, ¿cómo paso declaraciones de importación a través de subclases?] (Http://stackoverflow.com/questions/7252126/in-scala-how-do-i-pass-import-statements- a través de subclases) – Suma

Respuesta

11

Las importaciones que no sean una entidad de primera clase no exhiben el comportamiento que usted espera. En su lugar puede reestructurar su diseño thusly para lograr algo cercano:

trait A with C { 

} 

class B extends A { 
    def getValue = value // Now this will work. 
} 

trait C { 
    var value = 5 
} 

object C extends C 

Este idioma se utiliza en Scalaz 6 a usuarios de impuestos con el menor número posible de las importaciones.

+0

Esto parece funcionar solo si 'C' es un rasgo. ¿Qué pasa si 'C' es otra cosa (en mi caso,' C' es un método)? Cuando trato de usar este patrón, simplemente dice 'No puedo resolver el símbolo C' (donde' C' es el nombre del método que de otro modo estaría importando a través de 'com.xyz.C'). – socom1880

+0

Además, ¿y si quisiera incluir todo, como en 'com.xyz._'? – socom1880

+0

Para las dos opciones anteriores, debe mover la implementación a un rasgo, luego tener un objeto que simplemente amplíe el rasgo, como en la respuesta. Los rasgos se pueden extender para hacer la "mezcla", los objetos no. Para incluir todo, como com.xyz._, necesita implementar com.xyz a través de un objeto de paquete, con el objeto de paquete implementado de manera similar al extender un rasgo que tiene todas las implementaciones reales. Entonces, puedes usar ese rasgo para también "mezclar" en otro lugar. – RD1

Cuestiones relacionadas