Lal*_*lin 58 inheritance scala
有没有办法扩展一个案例类,而不是不断地沿途获取新的val?例如,这不起作用
case class Edge(a: Strl, b: Strl)
case class EdgeQA(a: Strl, b: Strl, right: Int, asked: Int) extends Edge(a, b)
Run Code Online (Sandbox Code Playgroud)
"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)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎并不干净..我错过了什么吗?
小智 64
正如之前的评论者所提到的:应该避免使用案例类扩展,但是您可以将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
Run Code Online (Sandbox Code Playgroud)
不要忘了喜欢def
过val
的特质
dav*_*rez 41
该解决方案比以前的解决方案具有一些优势:
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
Run Code Online (Sandbox Code Playgroud)
通过这种方式:
val
的,和小智 12
案例类不能通过子类扩展.或者更确切地说,案例类的子类本身不能是案例类.
从 开始Scala 3
,特征可以有参数:
trait Edge(a: Strl, b: Strl)
case class EdgeQA(a: Strl, b: Strl, c: Int, d: Int) extends Edge(a, b)
Run Code Online (Sandbox Code Playgroud)