跨越多个子类的特征变量

时间:2018-10-25 19:31:10

标签: scala class traits

我有一个特质,可以扩展两个类。一类对特质变量所做的更改会在第二类中反映出来吗?

让我们看看这样的简单代码

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。如果不具备特征,是否还有其他方法可以跨多个类访问同一变量,以便对一个类所做的更改也出现在其他类中?

2 个答案:

答案 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 +静态解决方案可能也有相同的缺点。如果您想避免这种情况,我认为您需要某种工厂来创建类的实例,以便在构造过程中为它们提供共享的变量引用。