我有一个模型类,我从我的服务器中的api回来,当我将它返回给某个客户端时,我想使用我自己的模型来保持客户端更简单和更清洁。
示例:
case class ReturnedModel(succeed: Option[String], reason: Reason, transactionId: List[Int], opId: Option[Int])
case class MyReturnedModel(reason: String)
我可能需要在将来做更多这样的事情,所以我想也许有一个我不知道的最好的做法,谢谢!
答案 0 :(得分:1)
您可以将伴随对象与自定义" apply"方法:
case class MyReturnedModel(reason: String)
object MyReturnedModel {
def apply(mod: ReturnedModel) = MyReturnedModel(mod.reason.toString)
}
val data: ReturnedModel = ... // Some instance of ReturnedModel
val mr = MyReturnModel(data)
请注意,case类及其随播对象需要位于同一个文件中才能生效。
答案 1 :(得分:0)
取决于您的使用案例:
sealed trait IKnowAReason { def reason:String }
case class ReturnedModel(succeed: Option[String], reason: Reason,
transactionId: List[Int], opId: Option[Int]) extends IKnowAReason
现在将MyReturnedModel
的使用替换为IKnowAReason
。注意密封,它将确保在同一源文件之外没有IKnowAReason
的其他实现。
答案 2 :(得分:0)
如果您有权更改ReturnedModel
,则可以使用@pedrofurla所展示的特征。
如果您无法修改ReturnedModel
,您可以声明一个隐式函数,将ReturnedModel
的所有实例转换为MyReturnedModel
,如下所示:
implicit def returnedModelToMyModel(returnedModel: ReturnedModel): MyReturnedModel = {
// Have some logic to convert their model to your model
MyReturnedModel(returnedModel.reason.toString)
}
然后,无论何时从API获得ReturnedModel
,您都可以在任何预期MyReturnedModel
实例的地方使用它:
def doWork(myReturnedModel: MyReturnedModel) = { /* Logic that needs and instance of MyReturnedModel */ }
// Grab an instance of ReturnModel from the API
val returned: ReturnedModel = ???
// Will get converted when you need it to be an instance of MyReturnedModel
doWork(returned)
当编译器发现您传递的类型不正确时,它将尝试预先形成隐式转换,此时它将寻找隐式转换以满足类型转换。