我有一個特徵定義了一個函數 - 我不想指定它將如何工作,直到以後。這個特點是混在幾個班的情況下,像這樣:在scala中使用值類來實現特徵方法?
trait AnItem
trait DataFormatable {
def render():String = "" // dummy implementation
}
case class Person(name:String, age:Int) extends DataFormatable with AnItem
case class Building(numFloors:Int) extends DataFormatable with AnItem
好了,現在我想的是拉皮條的這種渲染行爲的具體實現方式可包含的模塊。想在這裏使用值類:
object JSON {
implicit class PersonRender(val p:Person) extends AnyVal {
def render():String = {
//render json
}
}
// others
}
object XML {
implicit class PersonRender(val p:Person) extends AnyVal {
def render():String = {
//render xml
}
}
// others
}
理想的使用應該是這樣的(假設所需JSON輸出):
import JSON._
val p:AnItem = Person("John",24)
println(p.render())
所有很酷 - 但它不工作。有沒有一種方法可以讓這個可裝載的實現工作起作用?我關門了嗎?
我想我明白了。所以我更新了我的例子。如果我有一組具有不同實現的對象(特徵)(比如上面的AnItem列表),我想將它們呈現爲JSON或XML,具體取決於。如果它們中沒有一個實現render(),那麼在修改的示例中對特徵(AnItem)進行操作時,編譯器如何找到render()? – Greg 2015-02-12 03:51:05
它不能基於'AnItem'的類型信息。要麼編譯器需要知道你有'Person',所以它可以找到正確的隱式,或者'Person'(和其他類型)可能應該從一個共同的特性實現諸如toJSON和toXML等方法。這取決於你想要走哪條路。 – 2015-02-12 04:01:24
@Greg看我的編輯。 – 2015-02-12 11:59:10