![](/img/trans.png)
[英]Does extending a class in scala with constructor params add vals (fields) to the class?
[英]Extending scala case class without constantly duplicating constructors vals?
有没有一种方法可以扩展案例类,而无需在此过程中不断获取新的 vals?
例如这不起作用:
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)
这对我来说似乎并不干净......我错过了什么吗?
正如之前的评论者所提到的:应该避免案例类扩展,但您可以将 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
与以前的解决方案相比,该解决方案具有一些优势:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.