从特征扩展时在伴随对象中包含静态方法

时间:2018-01-23 04:38:42

标签: scala

我有一个特征Stage,以及扩展此特征的各种案例类。 Stage的每个扩展名都有一个伴随对象,如下所示:

sealed trait Stage{val: name}
final case class Write(name: String, outputPath: String, overwrite: String) extends Stage
object Write { implicit val fmt = Json.format[Write] }

我想让Stage的每个扩展也实现一个名为run的静态方法。我的理解是,在Scala中将所有静态方法放在伴随对象中是惯用的,而不是在类本身中。有点像:

sealed trait Stage{val: name, def run: String}
final case class Write(name: String, outputPath: String, overwrite: String) extends Stage
object Write {
    implicit val fmt = Json.format[Write] 
    def run: String = {...}
}

但是,由于案例类Write未实现函数run,因此会(正确地)抛出错误。在这种情况下,如何符合Scala在伴随对象中放置静态方法的标准?我是否应该在案例类中包含“run”,如此?

final case class Write(name: String, outputPath: String, overwrite: String) extends Stage {
    def run: Dataset = {...}
}

1 个答案:

答案 0 :(得分:2)

伴随对象就像任何其他对象一样。特别是,它们也可以扩展特征。所以你可能有这种次要行为的特征。

trait Stage { ... }
trait StageCompanion {
  def run(): Unit
}

class Write extends Stage { ... }
object Write extends StageCompanion {
  override def run() = { ... }
}

当然,在您的特定情况下,这样的特征已经存在:Java接口Runnable。所以你可以简单地

object Write extends Runnable { ... }