使现有类在scala中实现traits

时间:2017-10-16 13:36:38

标签: scala traits mixins

我有一个接受键值对的类,例如,它可以以map对象或case类的形式出现。让我们定义以下抽象:

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

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

  • 实施本身就是一张地图
  • 案例类我可以使用使用反射的东西从案例类中获取属性并将其放入地图中

问题是我无法弄清楚如何制作Product(所有案例类的基类)和Map类实现我的特性。我希望能够获取现有的类并混合可报告的特性,并根据类已有的方法实现它。

1 个答案:

答案 0 :(得分:7)

我认为你不能混合这样的特质。

然而,imho,听起来像 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

编译器应该在预期MapReportableOps的地方找到地图的隐式包装类Reportable并创建Reportable