文档章节

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

柳哥
 柳哥
发布于 2014/06/06 17:22
字数 454
阅读 49
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
37分钟前
1
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
0
0
890. Find and Replace Pattern - LeetCode

Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"abc ......

yysue
昨天
0
0
Linux | Redis

写在前面的话 常言道,不作笔记不读书。在下是深有体会啊,所以,跟我一起做下本节的笔记吧,或许多年以后,你一定会感谢今天的你。 安装 在官网的下载页 Redis Download 直接写了在Linux的安...

冯文议
昨天
1
0
NoSQL-memcached

NoSQL介绍 NoSQL叫非关系型数据库。而关系型数据库代表有MySQL。对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很...

ln97
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部