函数式对象之添加字段
博客专区 > 柳哥 的博客 > 博客详情
函数式对象之添加字段
柳哥 发表于4年前
函数式对象之添加字段
  • 发表于 4年前
  • 阅读 47
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

现在主构造器已经有了先决条件检查,我们继续关注加法功能的实现。首先在类Rational上定义公开的add方法,参数为另一个Rational对象。其次为了保持Ratrional的不可变性,add方法不能把传入的有理数加到自己身上,而是必须创建并返回全新的Rational累加值。看下面这个例子:


编译器会提示错误:


尽管类参数n和d都在add代码可引用的范围内,但是add方法仅能访问调用对象自身的值。因此,当add实现访问n或d的时候,编译器能够提供给你这些类参数值。但that.n或that.d绝对无法访问,因为that并不是调用add的Rational对象要想访问that的n和d,需要把它们放在字段中,如下:

package scalaTest
class Rational(n:Int,d:Int) {
    require(d != 0)    //先决条件
    val number:Int = n
    val denom:Int = d
    override def toString = number + “/" + denom
    def add(that:Rational):Rational = {
        new Rational(number * that.denom + that.number * d,d * that.denom)
    }
}

object M1{
    def main(args:Array[String]) {
        val r1 = new Rational(1,2)
        val r2 = new Rational(3,5)
        println(r1 add r2)
        println("r1.number: " + r1.number)
        println("r2.denom: " + r2.denom)
    }
}

我们增加了两个字段,分别是numer和denom,并用类参数n和d初始化注:尽管n和d在类范围内有效,但因为它们只是构造器的一部分,所以scala编译器不会为它们自动构造字段,所以有了以上的代码)。我们改变了toString和add的实现,让它们使用字段,而不是类参数。另外,我们之前不能在对象外部直接访问有理数的分子和分母,现在可以了。只要访问公共的number和denom字段即可。

标签: scala
共有 人打赏支持
粉丝 200
博文 394
码字总数 347782
×
柳哥
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: