48.scala编程思想笔记——统一访问方式和setter
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50447597
源码下载连接请见第一篇笔记。
先看一个例子如下:
import com.atomicscala.AtomicTest._
trait Base {
def f1:Int
def f2:Int
val d1:Int
val d2:Int
var d3:Int
var n = 1
}
class Derived extends Base {
def f1 = 1
val f2 = 1 //Was def, now val
val d1 = 1
// Can't dothis; must be a val:
// def d2 = 1
val d2 = 1
def d3 = n
defd3_=(newVal:Int) = n = newVal
}
val d = new Derived
d.d3 is 1 // Calls getter (line 20)
d.d3 = 42 // Calls setter (line 21)
d.d3 is 42
观察f1和f2定义,发现,在Scala中,可以将无参数且会产生结果的方法当做会产生同种类型结果的val处理。就是统一访问原则的示例。
反过来是不行的,如果基类型中有一个val,那么你不能使用def来实现它。
因为val表示一种承若,即事物不会变更,而def意味着在产生结果的过程中会执行代码。
抽象的var要求除了有getter之外,还需要有setter.
def d3_=(newVal:Int) = n = newVal
是setter的形式。