gpt4 book ai didi

Scala 的案例类及其传递给父类(super class)的构造函数参数

转载 作者:行者123 更新时间:2023-12-04 18:02:37 25 4
gpt4 key购买 nike

在 Scala 中,我可以将子类中的参数用于父类(super class),如下所示:

abstract class A(var a:Int)
class B(a:Int) extends A(a)
class C(a:Int) extends B(a)

object Main extends App {
val b = new C(10)
println(b.a)
b.a = 100
println(b.a)
}

但是,对于案例类,我有错误:

abstract class A(var a:Int)
class B(a:Int) extends A(a)
case class C(a:Int) extends B(a) // case generates a as val

object Main extends App {
val b = C(10)
println(b.a) // without val, a is not accessible
b.a = 100
println(b.a)
}

这是消息:

case_simple.scala:8: error: reassignment to val
b.a = 100
^

我看到它是由案例类引起的,它使构造函数参数不可变,但我对 C(var a:Int)

有错误
case_simple.scala:3: error: overriding variable a in class A of type Int;
variable a needs `override' modifier
case class C(var a:Int) extends B(a) // case generates a as val
^
one error found

并使用 C(override var a:Int)

case_simple.scala:3: error: overriding variable a in class A of type Int;
variable a cannot override a mutable variable
case class C(override var a:Int) extends B(a) // case generates a as val

如何解决这个问题?

最佳答案

1.

当你有这样的构造时:

 abstract class A(var a: Int)
class B(a: Int) extends A(a)
B 类中的

a 是传递给A 的父构造函数的构造函数参数。为了清楚起见,可以将其重写为:

 abstract class A(var a: Int)
class B(param: Int) extends A(param)

param 不是类 B 的成员,B 仍然只有一个派生自类的变量 a A

2。在 scala 中,不可能覆盖 var。好像说不通,但是找不到明确的解释。

进入正题

案例类对参数有特殊处理。语法是有限的,你不能定义不是类成员的案例类参数(valvar)。考虑到上面的两个语句,您唯一的选择是在 case 类中引入另一个字段,然后将其传递给父构造函数。它会产生冗余并且不是好的方法:

abstract class A(var a: Int)
class B(a: Int) extends A(a)
case class C(param: Int) extends B(param)

作为结论,我建议您避免将 case classes 与 vars 混合使用。案例类被设计为小型不可变 DTO。您可以使用案例类的 copy 方法来方便地更改一个或多个字段,同时保持不可变:

case class C(a: Int)

val b = C(10)
println(b.a)
val b1 = b.copy(a = 100)
println(b1.a)

关于Scala 的案例类及其传递给父类(super class)的构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com