如何在scala继承特征中提供含糊不清的引用?

时间:2014-07-31 09:31:23

标签: scala inheritance

我有特质,这个特性已经在框架中定义,不能改变:

trait GenericProfile {
def firstName: Option[String]
def lastName: Option[String]
def fullName: Option[String]
def email: Option[String]
def avatarUrl: Option[String]
}

我希望一个类继承它:

class BasicProfile(
providerId: String,
userId: String,
firstName: Option[String],
lastName: Option[String],
fullName: Option[String],
email: Option[String],
avatarUrl: Option[String]
) extends GenericProfile{
def providerId=this.providerId  //ambiguous reference will be here
...
}

但是如果我不重新定义未实现的方法,那么仍然存在错误,因为BasicProfile中的值被视为私有,并且不认为它已经实现。

我知道它可以简单地写为覆盖,但我在实践中有另一个类:

case class IdProfile(id:String,
providerId: String,
userId: String,
firstName: Option[String],
lastName: Option[String],
fullName: Option[String],
email: Option[String],
avatarUrl: Option[String])extends BasicProfile(providerId,userId,firstName,lastName,  fullName,email, avatarUrl){

}

我不希望IdProfile从其父类BasicProfile覆盖方法,只需继承即可。

2 个答案:

答案 0 :(得分:1)

由于BasicProfile必须确保所有已定义的trait方法都已实现(因为您不想使用抽象类),我建议使用case class BasicProfile。

您可以使用IdProfile class(而不是case class)扩展BasicProfile,并覆盖您所介入的特定方法(或保留它们)。如果我没弄错,那就是你想要完成的事情?

trait GenericProfile {
  def firstName: Option[String]
  def lastName: Option[String]
  def fullName: Option[String]
  def email: Option[String]
  def avatarUrl: Option[String]
}

case class BasicProfile(
  providerId: String,
  userId: String,
  var firstName: Option[String],
  var lastName: Option[String],
  var fullName: Option[String],
  var email: Option[String],
  var avatarUrl: Option[String]
) extends GenericProfile{
}

class IdProfile(id:String,
  providerId: String,
  userId: String,
  firstName: Option[String],
  lastName: Option[String],
  fullName: Option[String],
  email: Option[String],
  avatarUrl: Option[String])extends BasicProfile(providerId,userId,firstName,lastName,  fullName,email, avatarUrl){
}

如果您试图远离case class我建议您查看此问题:Simple Scala getter/setter override

希望这有帮助。

答案 1 :(得分:0)

要在参数列表中为类的构造函数定义可读字段,可以使用val

class BasicProfile(
  val providerId: String,
  val firstName: Option[String],
  ...
) extends GenericProfile {
  ...
}

如果未在构造函数参数上放置val(或者var作为可变字段),则通常不会创建字段。

如果将类定义为案例类,则将没有修饰符的构造函数参数视为在它们前面有val,并为它们创建字段:

case class BasicProfile(
  providerId: String,
  ...
) extends GenericProfile {
  ...
}
相关问题