文档章节

函数式对象之添加字段

柳哥
 柳哥
发布于 2014/06/06 15:32
字数 453
阅读 54
收藏 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字段即可。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 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
重构-改善既有代码设计

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

zhchl2010
2015/12/24
107
0
JavaScript总结3

类和模块 类和原型 JavaScript中, 类的所有实例对象都从同一个原型对象上继承属性的. 我们可以使用Object.create()来实现: 类和构造函数 构造函数是用来初始化新创建的对象的. 调用构造函数的...

fzyz_sb
2016/12/17
225
0
推特开源的Serial,轻量级,快速的json解析框架

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

阿韦爱Android
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 到底谁是小公猫……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Trivium的单曲《Throes Of Perdition》 《Throes Of Perdition》- Trivium 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁:...

小小编辑
52分钟前
90
3
基础选择器

注意:本教程参考自网上流传的李兴华老师的jquery开发框架视频,但是苦于没有相应的配套笔记,由我本人做了相应的整理. 本次学习的内容 学习jquery提供的各种选择器的使用,掌握了jquery选择...

江戸川
58分钟前
1
0
Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部