【发布时间】:2015-09-09 03:52:48
【问题描述】:
我有一个 trait 和两个扩展它的 case 类:
trait Authenticatable {
val email: String
val pass: String
val id: Long
val sessionid: String
}
case class Admin(
id: Long,
email: String,
pass: String,
sessionid: Option[String] = None) extends Authenticatable
case class Client(
id: Long,
email: String,
pass: String,
sessionid: Option[String] = None) extends Authenticatable
我有一些函数应该验证用户,用新的 sessionid 复制对象并返回它。
def auth(email: String, password: String): Try[Admin] ={
checkPass(models.Admin.findBy(sqls"email = $email"), password)
}
def auth(email: String, password: String, customer: Customer): Try[Customer] ={
checkPass(models.Customer.findBy(sqls"email = $email"), password)
}
private def checkPass (model: Option[Authenticatable], password: String): Try[Authenticatable]={
model match {
case Some(m) => check(password, m.pass).map(_ => m)
case _ => Failure(new Exception("Authentication failure!"))
}
}
问题是:我无法在 auth 函数中复制对象,因为函数 checkPass 返回 Authenticatable 而不是 Client 或 Admin 类,并且 Authenticatable 没有案例类的复制方法。
解决这个问题的正确方法是什么?
【问题讨论】: