У меня есть черта, которая определяет функцию - я не хочу указывать, как она будет работать дольше. Эта черта смешивается с несколькими классами случае, как так:Использование классов значений в 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
Итак, теперь я хочу includable модули, которые сутенер конкретные реализации этого поведения визуализации. Попытка использовать классы значений здесь:
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) в modded примере, каким образом компилятор найдет render()? – Greg
Он не может быть основан на информации типа 'AnItem'.Либо компилятор должен знать, что у вас есть «Личность», чтобы он мог найти правильное неявное, либо «Лицо» (и другие типы), возможно, должны реализовывать такие методы, как «toJSON» и «toXML» из общего признака. Это зависит от того, каким образом вы хотите идти. –
@Greg См. Мое редактирование. –