有没有办法扩展案例类而不必不断地获取新的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)
这对我来说似乎并不干净..我错过了什么吗?
答案 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 :(得分:11)
无法通过子类扩展案例类。或者更确切地说,案例类的子类本身不能是案例类。
答案 3 :(得分:0)
请注意,对于(Scala 3
的成立),Dotty
:
trait Edge(a: Strl, b: Strl)
case class EdgeQA(a: Strl, b: Strl, c: Int, d: Int) extends Edge(a, b)