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

本文深入探讨Scala中字段和方法在同一命名空间的特性,通过实例展示了如何利用这一特性实现方法的字段化,同时强调了与Java在命名空间上的区别。文章还指出,Scala限制在同一类中字段和方法同名,提供了更为严谨的命名规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上篇blog,scala里的字段和方法属于相同的命名空间,这让字段可以重写无参数方法。例如,你可以通过改变ArrayElement类中contents的实现将其从一个方法变为一个字段,而无需修改类Element中contents的的抽象方法定义,如例:

abstract class Elements {
    def contents: Array[String]
}
class ArrayElement(conts: Array[String]) extends Elements {
    val contents: Array[String] = conts
}

object ArrayElement {
    def main(args: Array[String]): Unit = {
        val array = new ArrayElement(Array("dddaaa", "dddww"))
        println(array.contents.length)
    }
}

这个版本的ArrayElement中的contents字段(用val定义)为Element类中的无参数方法contents(用def定义)提供了非常好的实现。

另一方法,scala里禁止在同一个类里用同样的名称定义字段和方法。尽管Java允许这样做。示例,这在scala类将不能通过编译:

class T2 {
    private var f = 0
    def f = 1    //不能编译通过,因为字段和方法重名
}

Java为定义准备了四个命名空间(分别是字段,方法,类型和包)相对,一般来说,scala仅有两个命名空间

  • 值(字段,方法,包还有单例对象)

  • 类型(类和特质名)

scala把字段和方法放进同一个命名空间的理由很明确,因为这样你就可以实现使用val重写无参数方法这种你在Java里做不到的事情。

转载于:https://my.oschina.net/fhd/blog/493849

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值