作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个抽象类,我扩展并制作了许多案例类。现在我想复制那些只是改变第一个参数的案例类的实例,所以我使用案例类'copy
方法。
由于我必须对从通用抽象类扩展而来的所有案例类都这样做,而不是对所有案例类都这样做,因此我尝试使其通用并将抽象类设为案例类。
然后 Scala 给了我这个:
case class Octopus has case ancestor Organism, but case-to-case inheritance is prohibited. To overcome this limitation, use extractors to pattern match on non-leaf nodes.
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)
clone
方法有效,那么我将不得不为
Octopus
进行复制&
Frog
.
最佳答案
你不能抽象案例类'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)
关于scala - Scala 中的个案继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745327/
我是一名优秀的程序员,十分优秀!