也许标题不太清晰,这是我的问题。
假设我有一个特性,它定义了一系列配置参数的应用程序。这些参数包含在一个Map中,其中一些具有默认值。
所以我可以按照以下方式创建自定义应用程序:
假设我有一个特性,它定义了一系列配置参数的应用程序。这些参数包含在一个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的这种方法,但我还没有找到更好的解决方案。