Reputation: 5449
Is there a way to extend a case class without constantly picking up new vals along the way?
For example this doesn't work:
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"
, so I'm forced to rename to a1
. But I don't want all kinds of extra public copies of "a" so I made it private.
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)
This just doesn't seem clean to me... Am I missing something?
Upvotes: 74
Views: 81979
Reputation: 61666
Starting in Scala 3
, traits can have parameters:
trait Edge(a: Strl, b: Strl)
case class EdgeQA(a: Strl, b: Strl, c: Int, d: Int) extends Edge(a, b)
Upvotes: 5
Reputation: 7012
This solution offers some advantages over the previous solutions:
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
In this way:
val
s, and Upvotes: 60
Reputation: 1296
As the previous commenter mentioned: case class extension should be avoided but you could convert your Edge class into a trait.
If you want to avoid the private statements you can also mark the variables as override
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
Don't forget to prefer def
over val
in traits
Upvotes: 79
Reputation: 1502
Case classes can't be extended via subclassing. Or rather, the sub-class of a case class cannot be a case class itself.
Upvotes: 15