70

有没有一种方法可以扩展一个案例类,而不会在此过程中不断地拾取新的 val?

例如,这不起作用:

case class Edge(a: Strl, b: Strl)
case class EdgeQA(a: Strl, b: Strl, right: Int, asked: Int) extends Edge(a, b)

"a" conflicts with "a",所以我被迫重命名为a1. 但我不想要“a”的各种额外公开副本,所以我将其设为私有。

case class Edge(a: Strl, b: Strl)
case class EdgeQA(private val a1: Strl, private val b1: Strl, right: Int, asked: Int) extends Edge(a, b)

这对我来说似乎并不干净......我错过了什么吗?

4

4 回答 4

73

正如前面的评论者提到的:应该避免案例类扩展,但您可以将 Edge 类转换为特征。

如果您想避免私有语句,您还可以将变量标记为覆盖

trait Edge{
  def a:Strl
  def b:Strl
}

case class EdgeQA(override val a:Strl, override val b:Strl, right:Int, asked:Int ) extends Edge

不要忘记defval特质上更喜欢

于 2012-06-23T17:18:57.643 回答
54

与以前的解决方案相比,此解决方案提供了一些优势:

trait BaseEdge {
  def a: Strl
  def b: Strl
}
case class Edge(a:Strl, b:Strl) extends BaseEdge
case class EdgeQA(a:Strl, b:Strl, right:Int, asked:Int ) extends BaseEdge

这样:

  • 你没有多余val的 s,并且
  • 你有 2 个案例类。
于 2015-05-15T09:25:48.733 回答
14

案例类不能通过子类化来扩展。或者更确切地说,案例类的子类不能是案例类本身。

于 2012-06-22T23:40:09.953 回答
2

从 开始Scala 3特征可以有参数

trait Edge(a: Strl, b: Strl)
case class EdgeQA(a: Strl, b: Strl, c: Int, d: Int) extends Edge(a, b)
于 2019-11-17T10:24:40.503 回答