使现有 类 在 scala 中实现特征
Make existing classes implement traits in scala
我有一个采用键值对的 class,例如,它可以以地图对象或案例 class 的形式出现。让我们定义以下抽象:
trait Reportable {
def getAttributes : Map[String,Any]
}
我想要一个采用 List[Reportable] 的方法。
可报告的可能实现是:
- 实施的地图本身
- 一个案例 class 我可以使用一些使用反射的东西从案例中获取属性 class 并将其放入地图中
问题是我不知道如何制作 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
。
我有一个采用键值对的 class,例如,它可以以地图对象或案例 class 的形式出现。让我们定义以下抽象:
trait Reportable {
def getAttributes : Map[String,Any]
}
我想要一个采用 List[Reportable] 的方法。 可报告的可能实现是:
- 实施的地图本身
- 一个案例 class 我可以使用一些使用反射的东西从案例中获取属性 class 并将其放入地图中
问题是我不知道如何制作 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
。