Class scala重写类参数
这个话题以前已经讨论过,但(我认为)没有得到令人满意的回答。 考虑下面的Scala代码:Class scala重写类参数,class,scala,parameters,overriding,Class,Scala,Parameters,Overriding,这个话题以前已经讨论过,但(我认为)没有得到令人满意的回答。 考虑下面的Scala代码: class A(A:Int){val\u A=A} 类A1(val a:Int){val_a=a} 类B(a:Int)扩展了a(a)//OK 类C(val a:Int)扩展了a(a)//OK 类B1(a:Int)扩展了A1(a)//OK 类C1(val a:Int)扩展了A1(a)//失败 类D1(覆盖值a:Int)扩展了A1(a)//确定 我认为将类参数声明为val只会对构造函数调用产生影响: 复制参数
class A(A:Int){val\u A=A}
类A1(val a:Int){val_a=a}
类B(a:Int)扩展了a(a)//OK
类C(val a:Int)扩展了a(a)//OK
类B1(a:Int)扩展了A1(a)//OK
类C1(val a:Int)扩展了A1(a)//失败
类D1(覆盖值a:Int)扩展了A1(a)//确定
我认为将类参数声明为val只会对构造函数调用产生影响:
复制参数而不是传递引用。但是,在每种情况下,类字段都被分配为val。这是否正确
现在我不明白的是为什么我们需要最后一行的override关键字。
请注意,我们没有将类声明为case类,因此不会自动分配字段
最后,有没有一个很好的理由可以解释为什么我们甚至想用val定义一个像A1这样的类
类参数
提前感谢所有回复
我认为,将类参数声明为val只具有
对构造函数调用的影响:复制参数而不是
传递推荐信。但是,在每种情况下,都会分配类字段
作为val,这是正确的吗
一点也不
如果构造函数中存在val或var,则会导致在类中声明同名的val或var,并在构造时为其分配构造函数参数。否则,如果构造函数参数在初始化外部(即在方法中)使用,则仍然可以在类中创建(私有)val
在A1类中,成员a实际上是无用的,因为如果你写
class A1(val a: Int) {}
相当于
class A1(someFreshName: Int) {val a = someFreshName}
因此,在C1
中,您试图声明一个新成员a,而该成员a已经存在。因此,覆盖。
在您的特定实例中,两个成员都具有相同的值,但您可以这样做(可能不是一个好主意)
然后,新成员
a
将构造函数参数作为值,先前的a
将具有值12并被隐藏(但是,在A1
中编写的代码仍将访问它) 为什么我在class A1(val a:Any){def test=a}中得到m:m
;类C1(override val a:Any)扩展了A1(12){override def toString=s“$a:$test”};println(新C1(“m”))
?什么是A1将访问它
?
class C1(override val a: Int) extends A1(12)