2017-10-16 129 views
0

我有一个类,它的键值对,这可以进来地图对象或情况为例类的形式。让我们定义以下的抽象:使现有的类实现性状斯卡拉

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

我想有一个List [通报]的方法。 对报告可能的实现方式是:

  • 的地图的实现也只是本身
  • 一个案例类,我可以使用的东西,使用反射来从案件类需要的属性,并把它变成一个地图

问题是我无法弄清楚如何使产品(所有案例类的基类)和地图类实现我的特质。我希望能够接受一个现有的课程并融入一个可报告的特质,并根据课程已有的方法来实施它。

回答

4

您不能混用特质一样,我认为。

但是,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

+0

我得到一个错误,当我尝试,非法继承;超AnyVal 不是混入性状通报 隐类MapReportableOps的超类对象 (私人VAL底层:地图[字符串,任何])的子类延伸AnyVal与通报{。我在scala 2.11 –

+2

只需删除'extends AnyVal'。 –