将案例类中的参数传递给特征

语境

为了能够更改测试配置,我对几乎所有代码都有一个特征。然后在案例类中,我试图传入配置。在我的测试中,我有一个测试用例类。

这有效(但不是我想要的功能)

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"

但不要尝试使用两半(每个机制各一半),它们不会以这种方式混合。


以上是将案例类中的参数传递给特征的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>