2012-02-16 1 views
6

ho il seguente codice:Scala - miscelazione in un tratto con le sue importazioni (importazioni che ereditano)

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

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

object C { 
    var value = 5 
} 

Il valore della classe B non è visibile ciò significa che l'importazione inerente di classe A non è stato ereditato da B, sebbene lo value sia perfettamente visibile all'interno di A. Come ottenere l'effetto di ereditare anche le importazioni in modo da evitare di importare esplicitamente le stesse cose in più classi in cui si mescola la caratteristica A?

+1

Possibile duplicato di [In Scala, come si passano le istruzioni import alle sottoclassi?] (Http://stackoverflow.com/questions/7252126/in-scala-how-do-i-pass-import-statements- attraverso-a-sottoclassi) – Suma

risposta

11

Le importazioni non essendo un'entità di prima classe non mostrano il comportamento che ci si aspetta. È invece possibile ristrutturare il vostro disegno questa convenzione per realizzare qualcosa di simile:

trait A with C { 

} 

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

trait C { 
    var value = 5 
} 

object C extends C 

Questo linguaggio è usato in Scalaz 6 per gli utenti di imposta con il minor numero possibile di importazioni.

+0

Questo sembra funzionare solo se 'C' è un tratto. Cosa succede se 'C' è un'altra cosa (nel mio caso,' C' è un metodo)? Quando provo a usare questo modello, si dice semplicemente 'Impossibile risolvere il simbolo C' (dove' C' è il nome del metodo che altrimenti avrei importato tramite 'com.xyz.C'). – socom1880

+0

Inoltre, cosa succede se volessi includere tutto, come in 'com.xyz._'? – socom1880

+0

Per entrambi i casi, è necessario spostare l'implementazione in un tratto, quindi disporre di un oggetto che estenda semplicemente il tratto, come nella risposta. I tratti possono essere estesi per fare il "mixing in", gli oggetti no. Per includere tutto, come com.xyz._ è necessario implementare com.xyz tramite un oggetto pacchetto - con l'oggetto pacchetto implementato in modo simile estendendo un tratto che ha tutte le implementazioni effettive. Quindi, puoi usare quel tratto per "mescolare" altrove. – RD1