使用自定义_ =进行Scala自动getter和setter覆盖

时间:2014-04-08 11:08:12

标签: class scala override setter getter

在scala中,类的用户在调用方法或使用val x = myclass.myproperty直接访问某个字段/成员之间没有区别。能够控制例如设置或获取字段,scala让我们覆盖_ =方法。但是=真的是一种方法吗?我很困惑。

我们来看下面的代码:

class Car(var miles: Int)

var myCar = new Car(10)
println(myCar.miles) //prints 10
myCar.miles = 50
println(myCar.miles) //prints 50

此代码也是如此(注意myCar.miles = 50中的双重空格):

class Car(var miles: Int)

var myCar = new Car(10)
println(myCar.miles) //prints 10
myCar.miles  = 50
println(myCar.miles) //still prints 50

现在我想改变miles的设置或阅读方式,例如总是在屏幕上打印一些东西。我怎么能这样做,以便我的类的用户不受影响,并且如果在=符号之前使用空格,它没有任何区别?

1 个答案:

答案 0 :(得分:9)

试试这个:

class Car(private var _miles: Int) {
  def miles = _miles
  def miles_=(m: Int): Unit = {
    println("boo")
    _miles = m
  }
}

空白并不重要。编译器看到您正在分配miles,并且无论您插入多少空格,都会插入对miles_=的调用。