我有一个特质,可以扩展两个类。一类对特质变量所做的更改会在第二类中反映出来吗?
让我们看看这样的简单代码
min-height
我想将trait parent {
var a: Int = 0;
}
class child1 extends parent {
def setValue(n: Int) = a = n
}
class child2 extends parent {
def getValue() : Int = a
}
object parentTest extends App {
val c = new child1()
c.setValue(2)
val d = new child2()
println(d.getValue)
}
的值打印为d
。如果不具备特征,是否还有其他方法可以跨多个类访问同一变量,以便对一个类所做的更改也出现在其他类中?
答案 0 :(得分:1)
将var
放在同伴对象中,然后将setter和getter代码放入特征中。
object Parent {private var a :Int = 0}
trait Parent {
def set(x :Int) :Unit = Parent.a = x
def get :Int = Parent.a
}
class Child1 extends Parent
class Child2 extends Parent
val c1 = new Child1
val c2 = new Child2
c1.set(9) //res0: Unit = ()
c2.get //res1: Int = 9
Parent.a = 6 //Error: variable a in object Parent cannot be accessed in object A$A83.this.Parent
如果var
是私有的,那么只能在伴随特征中访问它。
答案 1 :(得分:0)
在Java中,您将使用静态变量,Scala使用companion objects解决了大多数用例。
您可以创建自己的特征,以便使用(同伴)对象存储变量。
一个缺点是任何有权访问该对象的人都可以修改其状态,但是我认为Java +静态解决方案可能也有相同的缺点。如果您想避免这种情况,我认为您需要某种工厂来创建类的实例,以便在构造过程中为它们提供共享的变量引用。