接上篇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 //不能编译通过,因为字段和方法重名 }
时间: 2024-08-02 18:44:49