首页 > 其他 > 详细

组合与继承之重写方法和字段

时间:2015-08-18 12:24:02      阅读:292      评论:0      收藏:0      [点我收藏+]

接上篇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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!