我有特质,这个特性已经在框架中定义,不能改变:
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覆盖方法,只需继承即可。
答案 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 {
...
}