暗黙を使用して、ADT のケース クラス内にあるシリアル化メソッドを試してオーバーライドしようとしていますが、どのように行うべきかについて頭を悩ませることができません
// START OF API//
/**
* Serialize methods defined here
*
*/
object Serializer {
def string(block: (String => String)) = block
def int(block:(Int => String)) = block
def double(block:(Double => String)) = block
}
/**
* These are the DEFAULT serializers
*/
object Implicits {
implicit val string = Serializer.string (s => s)
implicit val int = Serializer.int (i => i.toString)
implicit val double = Serializer.double (d => String.valueOf(d))
}
/**
*
* Our simple ADT defined here
*/
import Implicits._
abstract class Vehicle {
def serialize:String
}
case class Car(s:String) extends Vehicle {
def serialize: String = string(s)
}
case class Truck(i:Int) extends Vehicle {
def serialize: String = int(i)
}
case class RocketShip(d:Double) extends Vehicle {
def serialize: String = double(d)
}
// END OF API
// START OF USER CODE
object UserImplicit {
implicit val string = Serializer.string(s => s.capitalize)
}
object Main extends App{
val v = Car("some car")
println(v.serialize)
import test.UserImplicit._
// This SHOULD print a capatilized version i.e. SOME CAR
println(v.serialize)
}
// END OF USER CODE
object Implicits
基本的に、API のユーザーが独自のシリアライザーを実装できるように、デフォルトのシリアライザー メソッド (内部に含まれているもの) にモンキー パッチを適用したいと考えています。
私は多くの組み合わせを試しました( a のtrait
代わりに a内に暗黙的なものを入れるなどobject
)が、実際にそれを機能させることができませんでした