使现有 类 在 scala 中实现特征

Make existing classes implement traits in scala

我有一个采用键值对的 class,例如,它可以以地图对象或案例 class 的形式出现。让我们定义以下抽象:

 trait Reportable {
    def getAttributes : Map[String,Any]
  }

我想要一个采用 List[Reportable] 的方法。 可报告的可能实现是:

问题是我不知道如何制作 Product(所有情况 classes 的基础 class)和 Map class 实现我的特征。我希望能够采用现有的 class 并混合可报告的特征,根据 class 已有的方法实施它。

我认为你不能像这样混合一个特征。

但是,恕我直言,听起来像是 EnrichMyLibrary 模式的情况。 Map 示例:

trait Reportable {
  def getAttributes : Map[String,Any]
}

object Reportable {
  implicit class MapReportableOps(private val underlying: Map[String, Any]) extends Reportable {
    def getAttributes: Map[String, Any] = underlying
  }
}

用法:

val reportables: List[Reportable] = Map("foo" -> "bar") :: Nil

编译器应该在需要 Reportable 的地方找到映射的隐式包装器 class MapReportableOps 并创建 Reportable