0
私はScala Playを使用してWebサービスを作成しています。機能は正常ですが、コードをより読みやすく、きれいにするために一部の部分をリファクタリングしています。スカラ - スーパークラスで暗黙の関数を定義することは可能ですか?
私はそれぞれのエンティティクラスを暗黙的に使用してJsonに変換可能にしました。私はまた、Seq[MyEntityClass]
にtoJson
関数を注入して、単一の関数を呼び出すことによってJson配列を作ることができました。
それは次のようになります。
case class MyModel(id: Option[Int], foo: String, bar: String)
object MyModel {
implicit val writer = Json.writes[MyModel]
implicit val reader: Reads[MyModel] = new Reads[MyModel] {
def reads(json: JsValue): JsResult[MyModel] = {
for {
foo <- (json \ "foo").validate[String]
bar <- (json \ "bar").validate[String]
} yield MyModel(None, foo, bar)
}
}
implicit def richMyModelSeq(apps: Seq[MyModel]) = new {
def toJson:JsValue = Json.toJson(apps)
}
// ...
}
はどのようにして各エンティティクラスにこのコードを繰り返さないために、スーパークラスでこのコードを定義することができますか?
なぜこれが機能しないのですか?
abstract class Jsonable {
implicit val writer = Json.writes[Jsonable]
implicit def richMyModelSeq(apps: Seq[MyModel]) = new {
def toJson:JsValue = Json.toJson(apps)
}
}
case class MyModel(id: Option[Int], foo: String, bar: String)
object MyModel extends Jsonable{
implicit val reader: Reads[MyModel] = new Reads[MyModel] {
def reads(json: JsValue): JsResult[MyModel] = {
for {
foo <- (json \ "foo").validate[String]
bar <- (json \ "bar").validate[String]
} yield MyModel(None, foo, bar)
}
}
// ...
}