【问题标题】:Inheritance with companion Objects伴随对象的继承
【发布时间】:2016-08-09 15:06:04
【问题描述】:

我正在尝试重构一些我目前看起来像这样的模型:

case class Person(name: String, age: Int)

object Person {
    implicit val reads: Reads[Person] = (
        (JsPath \ "name").read[String] and
        (JsPath \ "age").read[Int] 
    )(Person.apply _)
}

到看起来像这样的东西:

abstract class BaseModel {
    val pk: String  // Some stuff here that will be common
}

object BaseModel {
    implicit val reads: Reads[BaseModel] // Not sure what to do here
}

所以我可以这样做:

trait MyTrait[Model <: BaseModel] {

    // More code here
    val body: JsObject = ...
    val parsed = body.validate[Model]  // Error: There is no implicit value defined for Model

}


case class NewPerson extends BaseModel {...}
object NewPerson {...} // Maybe need to extend something here


class MyController extends MyTrait[NewPerson]

我希望每个模型都定义一个隐式读取值,但我不确定如何在抽象类的伴随对象中指出这一点。

【问题讨论】:

    标签: scala generics inheritance companion-object


    【解决方案1】:

    没有一种语言功能会强制将抽象类/伴侣对一起扩展。通过使抽象类的“伴侣”成为特征,我克服了这个缺失的环节。像这样的:

    abstract class BaseModel {
         val pk: String
    }
    
    trait ModelCompanion[A <: BaseModel] { self: Singleton =>
        implicit val reads: Reads[A]
    }
    
    case class Person(name: String, age: Int) extends BaseModel
    
    object Person extends BaseModel[Person] {
        ...
    }
    

    不幸的是,这仍然没有告诉MyTrait(在 OP 中定义)Model &lt;: BaseModel 有一个可以找到隐式Reads[Model] 的同伴。同样,需要手动创建链接,要求 MyTrait 持有对模型伴随对象的引用。

    trait MyTrait[Model <: BaseModel] {
    
        def companion: ModelCompanion[Model]
    
        implicit def reads: Reads[Model] = companion.reads
    
        // More code here
        val body: JsObject = ...
        val parsed = body.validate[Model]  // Now this would work
    
    }
    
    object MyTraitImpl extends MyTrait[Person] {
        def companion = Person
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2019-01-18
      • 2016-05-21
      相关资源
      最近更新 更多