2011-10-10 25 views
8

Scala'da, bir içeriğin karıştırıldığı sınıfın adlandırılmış bir yapıcı argümanına başvurması mümkün mü? Aşağıdaki kod, ModuleDao'nun yapıcı argümanı, özellikte tanımlandığı gibi bir değer olmadığı için derlenmez. Yapıcı argümanını herkese açık hale getirmek için val eklediğimde, özelliktekiyle eşleşir ve derler, ancak bunu val olarak ayarlamamayı tercih ederim. Bir val yapma ile tek endişesi görünürlük iseBir kurgundan bir argüman argümanı referansı

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

Neden bir 'val' olarak ayarlamak? Bunu zaten "Daoism" üzerinde yapıyorsun, o yüzden neden 'ModuleDao' de yapmıyorsun? Sorun şu ki, bildirdiğiniz gibi, sessionFactory etkili bir şekilde özeldir - başka kimse onu göremez. –

cevap

8

, sadece val şöyle korumalı bir hale getirebilir:

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

Teşekkürler - kıskançlık açısından sadece "val" ile gidebilir ve herkesin görebileceğini kabul edebilirim. Sadece dahili olarak kullanılıyor, bu durumda halkın kamuya açık olması pek mümkün değil. – Nick

İlgili konular