2011-08-31 13 views
14

Bu kodu göz önünde bulundurun:Soyut sınıflardaki ikincil kurucuların kullanımı nedir?

abstract class Foo(val s: String) { 
    def this(i: Int) = this("" + (i+2)) 
} 

Bildiğim kadarıyla kurucular devralınmadığı ve ikincil kurucular Java gibi super ile alt sınıflara çağrılabilir edilemez anladığım kadarıyla.

Sadece işe yaramaz bir eser mi yoksa bu yapı için makul bir kullanım durumu var mı?

cevap

17
scala> object Bar extends Foo(3) 
defined module Bar 

scala> Bar.s 
res3: String = 5 
11

alt sınıfının birincil yapıcı üst sınıfın yapıcı birini mutlaka birincil birini çağırmalıdır. Eğer bir gelişmişlik katan eğer @ coubeatczech cevabı ek olarak, ayrıca soyut sınıflar (ve özelliklerin) örneklerini oluşturabilir

abstract class A(s: String) { 
    def this(i: Int) = this(i.toString) 
} 
class B(i: Int) extends A(i) 
3

,

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

abstract class Foo(val s: String) { 
    def this(i: Int) = this("" + (i+2)) 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 

scala> val f = new Foo(23) {} 
f: Foo = [email protected] 

scala> f.s 
res3: String = 25 

I "(yukarıda boş bir zarafet göstermek ettik rağmen {} ") genellikle soyut üyeler için çoğunlukla bazı ek tanımlamalar sağlarsınız, bunlar genellikle soyut üyeler için uygulama sağlar,

scala> abstract class Bar { def bar : Int } 
defined trait Bar 

scala> val b : Bar = new Bar { def bar = 23 } 
b: Bar = [email protected] 

scala> b.bar 
res1: Int = 23 
İlgili konular