Scala中的大小写继承

Kam*_*nga 14 scala

我有一个抽象类,我扩展并创建了大量的case类.现在我想复制那些只更改第一个参数的案例类的实例,所以我使用case类的copy方法.

因为我必须为从公共抽象类扩展的所有案例类执行此操作,而不是为所有案例类执行此操作,所以我尝试将其设置为通用,并使抽象类成为案例类.

然后Scala给了我这个:

案例类八达通有案例祖先有机体,但禁止个案继承.要克服此限制,请使用提取器在非叶节点上进行模式匹配.

码:

abstract class Organism(legs: Int)
case class Octopus(override val legs: Int, weight: Double, ...)
case class Frog(override val legs: Int, ...)
def clone(o: Organism) = o.copy(legs = -1)
Run Code Online (Sandbox Code Playgroud)

这就是我想要做的.但是,如果我不能使该clone方法工作,那么我将不得不复制两个Octopus&Frog.

任何建议,以减少这种冗长?

lmm*_*lmm 12

你不能copy一般地抽象出案例类的方法.我建议使用Shapeless或Monocle的镜片:

trait Organism { def legs: Int }
// monocle @Lenses uses a macro to generate lenses
@Lenses case class Octopus(override val legs: Int, weight: Double, ...)
  extends Organism
@Lenses case class Frog(val legs: Int, ...) extends Organism

def clone[O <: Organism](o: O, legsLens: Lens[O, Int]): O =
  legsLens.set(-1)(o)

val myOctopus = Octopus(8, 2.4, ...)
val myFrog = Frog(2, ...)

// use the generated Lenses
val cloneOctopus: Octopus = clone(myOctopus, Octopus.legs)
clone(myFrog, Frog.legs)
Run Code Online (Sandbox Code Playgroud)