我想重写构造函数Trait中的一个可变变量。但它会抱怨说“重写Int类型的特征A中的变量a;变量a不能重写一个可变变量”。为什么斯卡拉不允许我这样做?对此有什么最佳做法?由于如何在Scala中重写Trait中的可变变量?
trait A{
var a:Int = _
}
class B(override var a:Int) extends A
我想重写构造函数Trait中的一个可变变量。但它会抱怨说“重写Int类型的特征A中的变量a;变量a不能重写一个可变变量”。为什么斯卡拉不允许我这样做?对此有什么最佳做法?由于如何在Scala中重写Trait中的可变变量?
trait A{
var a:Int = _
}
class B(override var a:Int) extends A
你不能覆盖它(为不暴露自己的身份我现在,除了原因,增值经销商可无论如何修改,为什么覆盖它们),但你可以离开这个声明的变量未初始化和委托后者到B
:
trait A {
var a: Int
}
class B(var a: Int) extends A
重写仅适用于方法。重写一个变量没有意义。如果用另一个相同类型的变量覆盖变量,会发生什么变化?如果有的话,该值和正好可以随时设定无论如何,因为它是一个变量:
trait A {
var a: Int = _
}
class B (a0: Int) extends A {
a = a0
}
但是,这propably不是你想要的。你也可能只是离开getter和setter摘要:
trait A {
def a: Int
def a_=(value: Int): Unit
}
class B(var a: Int)
,然后将其等同于
trait A {
var a: Int
}
注意确切知道你想实现与企图“超越”了“变种”是什么正如其他人所说,你可以改变。
在许多其他猜测中,其中一个是你想要类似自我类型的成员?自我类型注释允许您访问mixin特征或类的成员,并且Scala编译器确保所有依赖关系都正确连接?如果是这样,像下面这样的东西将工作。
trait B{
var a:Int = _
}
trait A{self:B=> var b= a}
class C extends A with B
你简化你的真实情况,使这个问题?正如很多答案指出的那样,用另一个相同的名称和类型覆盖var是非常没有用的。 – 2013-05-08 08:29:06