2013-06-25 35 views
0

考慮:你可以從構造函數中分配一個繼承的字段嗎?

trait Foo { 
    var foo: Int 
} 

abstract class Bar(foo: Int) extends Foo 

trait Baz { 
    self: Bar => 
    foo = 4 
} 

我得到以下錯誤:

value foo in class Bar cannot be accessed in Baz with Bar 
    foo = 4 
^

但是,如果我改吧以下幾點:

abstract class Bar(_foo: Int) extends Foo { 
    foo = _foo 
} 

它工作正常。有沒有辦法從構造函數中分配繼承的字段?它幾乎看起來像它的陰影。

回答

0

您可以分配繼承的字段。你只是有一個陰影問題(如你懷疑)。以下作品(Foo不變):

abstract class Bar(_foo: Int) extends Foo 

trait Baz { 
    self: Bar => 

    foo = 4 
} 

注意_foo: IntBar的構造函數不定義字段foo。但是,我們現在可以做的事:

val x = new Bar(1) with Baz { 
    // need to define foo 
    var foo: Int = _ 
} 

x.foo 
//> res0: Int = 4 

你可能想看看early initializers爲你做什麼。