2017-10-16 130 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'。 –