3

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

我按照以下说明进行操作:

lift-squeryl-record 示例

它没有使用 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”方式围绕它,比如重命名其中一种方法?我真的不想在两者之间做出选择。:(

4

1 回答 1

3

不,您不能重命名子类中的方法。如果父类型有两个冲突的方法签名,您将需要求助于另一种模式,例如通过委托进行间接(http://en.wikipedia.org/wiki/Delegation_pattern

trait AbstractUser[MyType <: AbstractUser[MyType]] extends ProtoUser[MyType] {
   def record: Record[MyType] with KeyedRecord[Long]
}
于 2011-04-15T23:14:46.987 回答