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 { ... }
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. –