2013-05-07 22 views
13

我想重写构造函数Trait中的一个可变变量。但它会抱怨说“重写Int类型的特征A中的变量a;变量a不能重写一个可变变量”。为什么斯卡拉不允许我这样做?对此有什么最佳做法?由于如何在Scala中重写Trait中的可变变量?

trait A{ 
    var a:Int = _ 
} 

class B(override var a:Int) extends A 
+1

你简化你的真实情况,使这个问题?正如很多答案指出的那样,用另一个相同的名称和类型覆盖var是非常没有用的。 – 2013-05-08 08:29:06

回答

11

你不能覆盖它(为不暴露自己的身份我现在,除了原因,增值经销商可无论如何修改,为什么覆盖它们),但你可以离开这个声明的变量未初始化和委托后者到B

trait A { 
    var a: Int 
} 

class B(var a: Int) extends A 
6

重写仅适用于方法。重写一个变量没有意义。如果用另一个相同类型的变量覆盖变量,会发生什么变化?如果有的话,该值和正好可以随时设定无论如何,因为它是一个变量:

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 
} 
1

注意确切知道你想实现与企图“超越”了“变种”是什么正如其他人所说,你可以改变。

在许多其他猜测中,其中一个是你想要类似自我类型的成员?自我类型注释允许您访问mixin特征或类的成员,并且Scala编译器确保所有依赖关系都正确连接?如果是这样,像下面这样的东西将工作。

trait B{ 
var a:Int = _ 

}

trait A{self:B=> var b= a} 
class C extends A with B