文档章节

函数式对象之私有字段和方法

柳哥
 柳哥
发布于 2014/06/06 17:22
字数 454
阅读 50
收藏 0

上一个版本的Rational里,我们只是分别用n初始化了number,用d初始化了denom。结果Rational的分子和分母可能比实际需要的要大。例如有理数66/42,可以简化为11/7。但目前Rational的主构造器没有这个功能。
有理数的简化,需要把分子和分母都除以最大公约数。如:66和42的最大公约数是6。66/42的分子和分母都除以6就产生它的最简形式11/7。见下面这个例子:

package scalaTest
class Rational(n:Int,d:Int) {
    require(d != 0) 
    private val g = gcd(n.abs,d.abs)    //注意这里
    val number:Int = n/g
    val denom:Int = d/g
    def this(n:Int) = this(n,1)
    override def toString = number + "/" + denom
    def add(that:Rational):Rational = {
        new Rational(number * that.denom + that.number * d,d * that.denom)
    }
    def lessThan(that:Rational) = {
        this.number * that.denom < that.number * this.denom
    }
    def max(that:Rational) = {
        if(this.lessThan(that)) that else this
    }
    private def gcd(a:Int,b:Int):Int = {        //注意这里
        if(b == 0) a else gcd(b,a % b)
    }
}
这里,我们添加了 私有字段g,并修改了number和denom的初始化。因为g是私有的,所以只能在类的主体之内被访问,外部不可见。我们还添加了 私有方法gcd用来计算传入的两个数的最大公约数。另外,把 private关键字放在 字段方法定义之前可以让定义 私有化
Scala编译器把Rational三个字段的初始化依照它们在源代码中出现的次序放入主构造器。所以g的初始化代gcd(n.abs,d.abs)将在另外两个之前执行,因为它在源文件中出现得最早。g将被初始化为类参数n和d的绝对值的最大公约数,然后再被用于number和denum的初始化。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 0
杭州
技术主管
C#基础知识系列五(构造函数)

前言   本节主要来学习下实例构造函数、私有构造函数和静态构造函数。   构造函数的作用:   1、当一个类在new实例化对象时,可调用构造函数进行初始化对象。   2、不带参数的构造函...

aehyok
2014/01/13
0
0
F#探险之旅(四):面向对象编程(中)

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

长征3号
2017/12/13
0
0
python 面向对象二

私有字段 ( filed) 不想被外部访问或不想暴露给外部的内容,可以定义一个 私有字段 self.xxx 私有字段不能被 对象和 类直接访问,需要 定义 1个函数来访问 (不推荐,相当于暴露) 私有方法:...

明月知心
2016/11/22
10
0
我设计的Fief语言简介,希望找志同道合的人一起实现

Fief语言简介 Fief语言是面向对象的,支持泛型的,简洁的语言 特点 1.面向接口编程 接口是只有成员声明而没有实现的集合体. 一个类可以显示声明对接口的继承,也可以不声明. 一个类只有实现一个...

太医
2013/12/06
0
16
python 面向对象(进阶篇)

上一篇《Python 面向对象(初级篇)》文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(...

米斯特赛文
2015/10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
7
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
18
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部