2011-10-10 14 views
8

In Scala, è possibile che un tratto faccia riferimento a un argomento del costruttore nominato della classe in cui è stato mescolato? Il seguente codice non viene compilato perché l'argomento del costruttore del modulo diDaoDao non è una val definita nel tratto. Se aggiungo val prima dell'argomento del costruttore per renderlo pubblico, corrisponde a quello nel tratto e viene compilato, ma preferirei non impostarlo come val.Riferimento a un argomento del costruttore da un tratto

trait Daoisms { 
    val sessionFactory:SessionFactory 
    protected def session = sessionFactory.getCurrentSession 
} 

class ModuleDao(sessionFactory:SessionFactory) extends Daoisms { 
    def save(module:Module) = session.saveOrUpdate(module) 
} 

/* Compiler error: 
class ModuleDao needs to be abstract, since value sessionFactory in trait Daoisms of type org.hibernate.SessionFactory is not defined */ 

// This works though 
// class ModuleDao(val sessionFactory:SessionFactory) extends Daoisms { ... } 
+0

Perché non si imposta come 'val'? Lo stai già facendo su Daoismo, quindi perché non farlo su 'ModuleDao? Il problema è che, come dichiari, 'sessionFactory' è effettivamente privato - nessun altro può vederlo. –

risposta

8

Se la vostra unica preoccupazione con rendendolo un val è la visibilità, si può solo fare la val protetti in questo modo:

scala> trait D { protected val d:Int 
    | def dd = d 
    | } 
defined trait D 

scala> class C(protected val d:Int) extends D 
defined class C 

scala> new C(1) 
res0: C = [email protected] 

scala> res0.d 
<console>:11: error: value d in class C cannot be accessed in C 
Access to protected value d not permitted because 
enclosing class object $iw in object $iw is not a subclass of 
class C in object $iw where target is defined 
       res0.d 
       ^

scala> res0.dd 
res2: Int = 1 
+1

Grazie - per brevità, posso andare con 'val' e accettare che sia pubblicamente visibile. È usato solo internamente, quindi in questo caso il pubblico non è troppo pubblico. – Nick

Problemi correlati