可以重命名基类的Scala方法吗?

时间:2011-04-15 18:21:08

标签: scala multiple-inheritance lift record squeryl

我对Scala很新,我正试图在Lift中使用lift-squeryl-record。 Scala是2.8.1,Lift是2.3。我的问题是我想使用Record中的(Mega)ProtoUser,但它与lift-squeryl-record冲突。

我遵循了以下指示:

lift-squeryl-record example

没有使用ProtoUser,并试图像这样定义我的用户:

trait AbstractUser[MyType <: AbstractUser[MyType]] extends
ProtoUser[MyType] with Record[MyType] with KeyedRecord[Long] {

注意:KeyedRecord来自包net.liftweb.squerylrecord,而不是net.liftweb.record

然后我收到以下错误:

overriding lazy value id in trait ProtoUser of type net.liftweb.record.field.LongField[MyType]; method id in trait KeyedRecord of type => Long needs覆盖'修饰符`

因为KeyedRecord和ProtoUser都定义了不同的id方法。由于我不控制类/特征的代码,是否有任何“Scala”方法,比如重命名其中一个方法?我真的不想在两者之间做出选择。 :(

1 个答案:

答案 0 :(得分:3)

不,你不能重命名子类中的方法。如果父类型中存在两个冲突的方法签名,则需要求助于另一种模式,例如通过委派(http://en.wikipedia.org/wiki/Delegation_pattern

的间接方式
trait AbstractUser[MyType <: AbstractUser[MyType]] extends ProtoUser[MyType] {
   def record: Record[MyType] with KeyedRecord[Long]
}