扩展scala案例类而不经常复制构造函数的vals?

时间:2012-06-22 23:31:14

标签: scala

有没有办法扩展案例类而不必不断地获取新的val?例如,这不起作用

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

“a”与“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 个答案:

答案 0 :(得分:62)

正如之前的评论者所提到的:应避免使用案例类扩展,但您可以将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

不要忘记在特质

中优先def而不是val

答案 1 :(得分:36)

与以前的解决方案相比,此解决方案具有一些优势:

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
  • 你有2个案例类。

答案 2 :(得分:11)

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

答案 3 :(得分:0)

请注意,对于enter image description hereScala 3的成立),Dotty

trait Edge(a: Strl, b: Strl)
case class EdgeQA(a: Strl, b: Strl, c: Int, d: Int) extends Edge(a, b)