我有一个特征定义了一个函数 - 我不想指定它将如何工作,直到以后。这个特点是混在几个班的情况下,像这样:在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