3

私は Scala の初心者で、Lift で lift-squeryl-record を使用しようとしています。Scala は 2.8.1 で Lift は 2.3 です。私の問題は、Record から (Mega)ProtoUser を使用したかったことですが、lift-squeryl-record と競合します。

私は次の指示に従いました:

Lift-Squeryl-レコードの例

これは ProtoUser を使用せず、次のようにユーザーを定義しようとしました:

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

注意: KeyedRecord は、net.liftweb.record ではなく、パッケージ net.liftweb.squerylrecord からのものです。

次に、次のエラーが表示されます。

overriding lazy value id in trait ProtoUser of type net.liftweb.record.field.LongField[MyType]; method id in trait KeyedRecord of type => Long needsoverride'修飾子`

KeyedRecord と ProtoUser の両方が異なる id メソッドを定義しているためです。どちらのクラス/特性のコードも制御していないため、メソッドの名前を変更するなど、「Scala」の方法はありますか? 本当はどちらかを選ばなくていいんです。:(

4

1 に答える 1

3

いいえ、サブクラスのメソッドの名前を変更することはできません。親型からの 2 つの競合するメソッド シグネチャがある場合は、委譲による間接化 ( 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 に答える