我有一个特征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 = {...}
}
答案 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 { ... }