覆盖特质和自我类型

dav*_*ell 2 scala traits self-type scalatest

我想覆盖ScalaTest特性BeforeAndAfterEach,以便为我的所有测试实现一次.最后我得到它编译,但我不明白为什么.

trait MySetup extends BeforeAndAfterEach {
  this : org.scalatest.BeforeAndAfterEach with org.scalatest.Suite =>
  var service: String = _

  abstract override def beforeEach(): Unit = {
    service = "apa"
    super.beforeEach()
  }

  abstract override def afterEach(): Unit = {
    service = ""
  }
}
Run Code Online (Sandbox Code Playgroud)

让它运作的是线:

  this : org.scalatest.BeforeAndAfterEach with org.scalatest.Suite =>
Run Code Online (Sandbox Code Playgroud)

我在BeforeAndAfterEach实现的开头找到它并复制它.

它做了什么,为什么需要它?

更新:

这是一个更简单的版本.

trait MySetup extends FlatSpec with BeforeAndAfterEach {
  var service: String = _

  override def beforeEach {
    service = "apa"
    super.beforeEach
  }

  override def afterEach {
    service = ""
    super.afterEach
  }
}
Run Code Online (Sandbox Code Playgroud)

mpi*_*ist 5

BeforeAndAfterEach具有自我类型的Suite,这意味着BeforeAndAfterEach只能混合到扩展Suite的类型中.ScalaTest希望您首先选择主套件类型,然后再选择混合行为.

自我类型声明不会在子特征中继承,因此您必须重新声明自我类型.

以下问题在自我类型和子特征之间存在一些权衡:自我类型和特质子类之间有什么区别?

有关ScalaTest设计的一些背景信息,请参阅:http://www.artima.com/scalazine/articles/selfless_trait_pattern.html