文档章节

函数式对象之添加字段

柳哥
 柳哥
发布于 2014/06/06 15:32
字数 453
阅读 55
收藏 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
杭州
技术主管
私信 提问
F#探险之旅(四):面向对象编程(中)

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

长征3号
2017/12/13
0
0
Golang 学习笔记(5)—— 面向对象编程

本文为转载,原文:Golang 学习笔记(5)—— 面向对象编程 前言 golang是面向过程的语言,go中没有类,单go支持面向对象的编程,go中的struct就像其他语言中的类;go里没有继承,但可以通过...

ChainZhang
2017/12/25
0
0
推特开源的Serial,轻量级,快速的json解析框架

你还在用Gson,fastjson吗?最近几个月推特开源了她们的json解析和序列化框架 Serial,这是一个轻量级框架,操作起来也很简单。下面简单的介绍一下。 github地址: https://github.com/twitt...

阿韦爱Android
2017/11/22
0
0
重构-改善既有代码设计

重构是在不改变软件可观察行为的前提下,对代码作出修改,以改进程序的内部结构。本质上说就是在代码写好后改进它的设计 重构往往意味着不了解软件行为下重构程序 2.在设计前期使用模式常常导...

zhchl2010
2015/12/24
107
0
ASP.NET Core中使用GraphQL - 第一章 Hello World

前言 你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL。 GraphQL提供了一种声明式的方式从服务器拉取数据。你可以从GraphQL官网中了解到GraphQL的所有优点。在这一系列博客中,我将展...

dotNET跨平台
11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据集汇总

1.朝鲜语,英语混合数据集 http://www.iapr-tc11.org/mediawiki/index.php/KAIST_Scene_Text_Database 2.OCR资源博客 https://github.com/tangzhenyu/Scene-Text-Understanding 3.阿拉伯语英......

clgo
7分钟前
0
0
Linux时间同步方式

https://blog.csdn.net/sunny_future/article/details/78279726

呼呼南风
9分钟前
1
0
Hashtable程序员面试五分钟被请出来了

你们可能会想,栈长这么菜的吗?5分钟都坚持不了? 本文说起来会有点尴尬,毕竟这是栈长我曾经经历过的故事。。。 那时候的栈长还真菜,每天写着 if/ for 及一些简单的业务逻辑代码,虽工作有...

金铭鼎IT教育
11分钟前
2
0
Docker安装rabbitmq

安装rabbitmq,要先安装erlang,有点麻烦,如果使用Docker方式来安装rabbitmq,那就不需要预先安装erlang了。 1、下载rabbitmq镜像 List-1 在docker hub上rabbitmq的tag很多,但是我们使用3...

克虏伯
12分钟前
1
0
架构师究竟要不要写代码?

Talk is cheap, show me the code! 但是在互联网企业中,身处技术要职的架构师到底需不需要写代码? 在我们的专业领域中有一种普遍存在的误解:架构师的工作不需要写代码。 就目前看来这似乎...

我的卡
14分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部