标签:
接上篇blog,scala里的字段和方法属于相同的命名空间,这让字段可以重写无参数方法。例如,你可以通过改变ArrayElement类中contents的实现将其从一个方法变为一个字段,而无需修改类Element中contents的的抽象方法定义,如例:
abstract class Elements {
def contents: Array[String]
val height = contents.length
val width = if(height == 0) 0 else contents(0).length
}
class ArrayElement(conts: Array[String]) extends Elements {
//不加lazy就报错,现在还不明白为什么,先记录下
lazy val contents: Array[String] = conts
}
object ArrayElement {
def main(args: Array[String]): Unit = {
val array = new ArrayElement(Array("dddaaa", "dddww"))
println(array.width)
}
}
这个版本的ArrayElement中的contents字段(用val定义)为Element类中的无参数方法contents(用def定义)提供了非常好的实现(在scala2.10.7版本中,为什么前面一定要加lazy才不会报错呢?不加会报空指针异常!!!)。
另一方法,scala里禁止在同一个类里用同样的名称定义字段和方法。尽管Java允许这样做。示例,这在scala类将不能通过编译:
class T2 {
private var f = 0
def f = 1 //不能编译通过,因为字段和方法重名
}
标签:
原文地址:http://my.oschina.net/fhd/blog/493849