標題可能不太清楚。這是我的問題。斯卡拉 - 特徵成員初始化:使用特徵修改類成員
比方說,我有一個特徵,它定義了一系列配置參數的應用程序。這些參數包含在Map
中,其中一些參數具有默認值。
trait ConfApp {
val dbName: String
lazy val conf: scala.collection.mutable.Map[String, Any] = scala.collection.mutable.Map("db" -> dbName, "foo" -> "bar")
}
因此,我可以按如下方式創建一個自定義應用程序:
class MyApp extends ConfApp {
override val dbName = "my_app_db"
// print app configuration parameters
println(conf)
def add() = {...}
...
}
val M1 = new Myapp // Map(db -> my_app_db, foo -> bar)
我想創建一個設置一些其他配置參數,其它性狀。換句話說,我希望能夠做這樣的事情:
class MyApp2 extends ConfApp with LogEnabled {
override val dbName = "my_app2_db"
// print app configuration parameters
println(conf)
def add() = {...}
...
}
val M2 = new Myapp2 // Map(db -> my_app_db, foo -> bar, log -> true)
到目前爲止,我已經成功地做到以下幾點:
trait LogEnabled {
val conf: scala.collection.mutable.Map[String, Any]
conf("log") = true
}
trait LogDisabled {
val conf: scala.collection.mutable.Map[String, Any]
conf("log") = false
}
trait ConfApp {
val dbName: String
lazy val conf: scala.collection.mutable.Map[String, Any] = scala.collection.mutable.Map("db" -> dbName, "foo" -> "bar")
}
class MyApp extends ConfApp {
val dbName = "my_app_db"
println(conf)
}
class MyApp2 extends ConfApp with LogDisabled {
val dbName = "my_app_db"
println(conf)
}
val M = new MyApp // Map(db -> my_app_db, foo -> bar)
val M2 = new MyApp2 // Map(log -> false, foo -> bar, db -> null)
但你可以在M2
看到db
參數null
。我無法理解我做錯了什麼。
此致,我並不喜歡這種可變Map方法,但我還沒有設法做得更好。
嗯,處理初始化的美麗混合性狀時的問題。 –