将案例类中的参数传递给特征
语境
为了能够更改测试配置,我对几乎所有代码都有一个特征。然后在案例类中,我试图传入配置。在我的测试中,我有一个测试用例类。
这有效(但不是我想要的功能)
trait Greeting(val name: String) {
def msg = s"How are you, $name"
}
class prodEnvClass extends Greeting("Production Env") {
println(msg)
}
class testEnvClass extends Greeting("Testing Env") {
println(msg)
}
这不起作用(但这是我想要的功能)
trait Greeting(val name: String) {
def msg = s"How are you, $name"
}
class prodEnvClass extends Greeting(myEnv) {
val myEnv = fetchProdEnv()
println(msg)
}
class testEnvClass extends Greeting(myEnv) {
val myEnv = fetchTestEnv()
println(msg)
}
题
如何将案例类主体内的参数传递给特征?有效的代码与我的用例不匹配。我想使用 case 类中的代码来输入特征。
回答
您似乎以一种不应该工作的方式将函数调用与继承混合在一起。
对于函数调用,您
- 创建绑定器作为函数参数,然后
- 将值作为参数传递,
像这样:
def f(s: String) { println(s) }
f("hello (function invocation)")
使用继承时,你
- 通过命名抽象成员来创建活页夹,然后您
- 通过为这些抽象成员提供实现来传递值
像这样:
trait C { def s: String; def m() = println(s) }
new C { val s = "hello (inheritance)"; m() }
在您的代码中,您似乎试图
- 将值绑定为构造函数参数(就像对函数所做的那样)
- 通过
myEnv在两个子类中以不同的方式覆盖它来传递值(就像继承一样)
只需选择一种机制。如果你想要继承,那么做继承:
class MyEnv(val name: String)
trait Greeting {
def myEnv: MyEnv
def msg = s"hello ${myEnv.name}"
}
def fetchProdEnv() = new MyEnv("prod")
def fetchTestEnv() = new MyEnv("test")
class ProdEnvClass extends Greeting {
val myEnv = fetchProdEnv()
println(msg)
}
class TestEnvClass extends Greeting {
val myEnv = fetchTestEnv()
println(msg)
}
new ProdEnvClass() // "hello prod"
new TestEnvClass() // "hello test"
但不要尝试使用两半(每个机制各一半),它们不会以这种方式混合。