En Scala, ¿es posible que un rasgo haga referencia a un argumento constructor nombrado de la clase en la que se mezcla? El código siguiente no se compila porque el argumento constructor de ModuleDao no es val como se define en el rasgo. Si agrego val
antes del argumento constructor para hacerlo público, coincide con el del rasgo y se compila, pero prefiero no configurarlo como val
.Referencia a un argumento de constructor de un rasgo
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 { ... }
¿Por qué no se establece como 'val'? Ya lo estás haciendo en 'Daoism', entonces ¿por qué no hacerlo en' ModuleDao'? El problema es que, como declaras, 'sessionFactory' es efectivamente privado, nadie más puede verlo. –