2011-08-31 113 views
14

考慮以下代碼:抽象類中的次構造函數的用例是什麼?

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

據我瞭解構造函數不能被繼承和次級構造不能從子類與super叫象Java。

它們只是一個無用的工件,或者是否存在這種構造的一些明智的用例?

回答

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

scala> Bar.s 
res3: String = 5 
11

子類的主構造必須調用父類的構造函數中的一個,不一定主之一。

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

除了@ coubeatczech的回答,您還可以,如果你添加一個細化創建抽象類(和特性)的情況下,

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 

雖然我看到前面一個空的細化(」 {}「),您通常會提供一些額外的定義,通常爲抽象成員提供實現,

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 
相關問題