扩展 scala case 类而不需要不断地重复构造函数 val?

有没有一种方法可以扩展一个 case 类,而不用在这个过程中不断地获取新的 val?

例如,这种方法行不通:

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

所以我不得不重命名为 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)

这对我来说不太干净... 我是不是漏掉了什么?

70748 次浏览

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

正如前面的评论所提到的: 应该避免使用 case 类扩展,但是您可以将 Edge 类转换为 trait。

如果希望避免使用私有语句,还可以将变量标记为重写

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

这种解决方案比以前的解决方案有一些优点:

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
  • 你有两门案例课。

Scala 3性状可以有参数开始:

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