2011-11-18 108 views
38

如果我理解正確,特徵是最接近Java接口的類,並且類構造函數自動設置變量。使用scala構造函數設置trait中定義的變量

但如果我有一個延伸的特點,並具有一個構造函數,設定從特徵變量的類,所以像:

trait Foo { 
    var foo: String 
} 

class Bar (foo: String) extends Foo { /* ... */ } 

我想要的foo串性狀的設置時我製作了一個Bar對象。

編譯器似乎給了我這個錯誤。什麼是實現這一目標的正確方法?

+1

只需要注意:特徵初始化本身並不是一件簡單的事情,並且可以通過變量和重寫來快速地完成初始化(我做過)。確保你確實需要它。 – CheatEx

回答

25

Bar必須在Foo中定義摘要var foo(對於val應該是相同的)。這可以在構造

class Bar(var foo: String) extends Foo{...} 

來完成(當然,也可能是在Bar身體做得太)。默認情況下,如果需要,構造函數參數將被轉爲私有val,也就是說,如果它們在方法中的啓動代碼之外使用。但是你可以通過標記它們valvar強制行爲,並可能控制可見在

class X(protected val s: String, private var i: Int) 

在這裏,你需要一個公共var實施Foo

30
trait Foo { var foo: String = _ } 
class Bar(foo0: String) extends Foo { foo = foo0 } 

該特徵聲明一個未初始化的var;該類然後將其設置爲等於輸入參數。

或者,

trait Foo { 
    def foo: String 
    def foo_=(s: String): Unit 
} 
class Bar(var foo: String) extends Foo {} 

聲明對應於foo,它由類設置的getter/setter對。