文档章节

函数式对象之添加字段

柳哥
 柳哥
发布于 2014/06/06 15:32
字数 453
阅读 65
收藏 0

阿里云携手百名商业领袖、技术大咖,带您一探行进中的数字新基建!>>>

现在主构造器已经有了先决条件检查,我们继续关注加法功能的实现。首先在类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字段即可。

© 著作权归作者所有

柳哥
粉丝 206
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
加载中

评论(0)

F#探险之旅(四):面向对象编程(中)

F#系列随笔索引 对象表达式(Object Expressions) F#中的OOP语法很简洁,而对象表达式则正是这种简洁性的核心所在。通过对象表达式,我们可以创建抽象类或接口的轻量级实现,也可以对一个具...

长征3号
2017/12/13
0
0
【DailyENJS第7期】掌握 React 函数式组件

DailyENJS 致力于翻译优秀的前端英文技术文章,为技术同学带来更好的技术视野。 多年来,我意识到开发高质量React应用程序的唯一正确方法是编写无状态的函数式组件。 在本文中,我将简要介绍...

_忽如寄
2019/08/04
0
0
Django博客项目之个人站点

一、对url做分发 项目cnblog_s20的urls.py内容: from django.conf.urls import url,includefrom django.contrib import adminfrom blog import viewsfrom django.views.static import serve......

宋鹏超
2018/05/24
0
0
Chapter 3 :代码的坏味道

“如果尿布臭了,就换掉它。” ——Beck奶奶,论保持小孩清洁的哲学 代码的坏味道这一章集中论述该何时重构。具体的重构方法在后面的章节。 “没有任何度量规矩比得上见识广博者的直觉。你必...

osc_fted3syf
04/16
2
0
你对JavaScript的Array对象了解有多少?

前言 工作中,数组应用非常广泛,菜单、列表、banner图等等都会应用到数组,所以必须对数组的属性和方法非常熟练才OK,下面一起来了解一下。定义Array 参数 size 是期望的数组元素个数。返回...

向建峰_Javan
2018/08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

URL 中文链接 编码错误 完美解决

直接上代码 str = "%25E4%25B8%25AD%25E6%2596%2587";console.log(str);str =decodeURIComponent(decodeURIComponent(str));console.log(str); 输出结果 %25E4%25B8%25AD%25E6%2596%25......

放只虎归个山
今天
17
0
.NET中小数,浮点数和双精度之间的区别? - Difference between decimal, float and double in .NET?

问题: What is the difference between decimal , float and double in .NET? .NET中的decimal , float和double float什么区别? When would someone use one of these? 有人什么时候会使用......

fyin1314
今天
22
0
如何找出Windows上正在侦听端口的进程? - How can you find out which process is listening on a port on Windows?

问题: 如何找出Windows上正在侦听端口的进程? 解决方案: 参考一: https://stackoom.com/question/CXO/如何找出Windows上正在侦听端口的进程 参考二: https://oldbug.net/q/CXO/How-can...

技术盛宴
今天
10
0
OSChina 周三乱弹 —— 一家动物都快饿成标本了~

@黑觉非常君 :前天晚上9点开始睡觉,睡到昨天上午8点起床,昨天下午2点又睡,睡到下午7点多,晚上10点又困了,又睡,睡到今天上午8点,中途没醒过,怎么这么能睡,是不是快挂了。 能睡不是好...

小小编辑
今天
26
0
神剧推荐全剧最污片段精剪

神剧推荐,全剧最污片段精剪 豆瓣评分最高,脑洞最大,脑回路最曲折,恶搞无数经典,没有一条差评的神剧 整个系列完整版 到这里观看

a57571735
今天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部