Search code examples
scalamultiple-inheritanceliftrecordsqueryl

Can a Scala method from a base-class be renamed?


I'm rather new to Scala, and I am trying to use lift-squeryl-record in Lift. Scala is 2.8.1 and Lift is 2.3. My problem is that I wanted to use (Mega)ProtoUser from Record, but it conflicts with lift-squeryl-record.

I followed the instruction of:

lift-squeryl-record example

which did not use ProtoUser, and tried to define my user like this:

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

NB: KeyedRecord is from package net.liftweb.squerylrecord, not net.liftweb.record

Then I get the following error:

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

Because both KeyedRecord and ProtoUser define a differing id method. Since I do not control the code of neither classes/traits, is there any "Scala" way around it, like renaming one of the methods? I really don't want to have to choose between the two. :(


Solution

  • No you cannot rename methods in a subclass. If there are two conflicting method signatures from parent types, you will need to resort to another pattern, such as indirection through delegation ( http://en.wikipedia.org/wiki/Delegation_pattern )

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