文档章节

函数式对象之辅助构造器

柳哥
 柳哥
发布于 2014/06/06 16:26
字数 486
阅读 98
收藏 0

有些时候一个类里需要多个构造器。Scala里主构造器之外的构造器被称为辅助构造器。比方说,分母为1的有理数只写分子的话就更简洁。因此,Rational(5,1)简写成Rational(5)或许感觉会更好些。而这就需要给Rational添加只传入分子的辅助构造器并预先设定分母为1。如例:

package scalaTest
class Rational(n:Int,d:Int) {
    require(d != 0)
    val number:Int = n
    val denom:Int = d
    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
    }
}

Scala的辅助构造器定义开始于def this(....)。函数主体几乎完全是主构造器的调用,并传递了参数n做分子和1做分母。Scala里的每个辅助构造器的第一个动作都是调用同类其它的构造器。换句话说就是,scala类的每个辅助构造器都是以“this(......)”形式开头的。被调用的构造器既可以是主构造器,也可以是其它已定义的辅助构造器。规则的根本结果就是每个scala的构造器调用终将结束于对主构造器的调用,因此主构造器是类的唯一入口点

注意
若熟悉java,你或许会奇怪为什么scala构造器的规则比java的还要严格。Java里构造器的第一个动作只有两个选择:要么调用同类的其他构造器,要么直接调用超类的构造器。Scala类里面只有主构造器可以调用超类的构造器。Scala里这种严格的限制实际上是为了让scala的构造器与java构造器相比更为清晰和简洁而付出的代价。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 0
杭州
技术主管
Scala笔记整理(四):Scala面向对象—类详解2(继承相关)

[TOC] 单例 希望某个类只存在一个使用的对象,而不管有多少个调用者在使用它,就是单例的概念。 Java中的单例 Scala中的单例 代码及说明如下: 输出结果如下: 伴生类和伴生对象 直接看下面的...

xpleaf
04/20
0
0
继承中子类的构造器调用父类的构造器

构造器的作用:初始化对象的成员变量。 构造器不能被子类继承,普通方法和属性可以被子类继承。 默认情况下,子类的构造器中的第一行隐式地调用父类默认的无参构造器,以初始化父类的成员变量...

恒者
2013/12/23
0
2
全面理解面向对象的 JavaScript

简介: JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征。本...

IBMdW
2013/04/21
1K
6
对js中事件监听的理解

事件监听是js中异步编程的一种手段。对监听模式的理解,可以对应到JQuery的事件绑定中的用到的对象上: 被监听对象 -- dom对象 监听对象 -- 回调函数(对象) 事件对象 -- (隐式或显式)传入...

码上有春天
2016/08/26
55
0
python高级:列表解析和生成表达式

一、语法糖的概念“糖”,可以理解为简单、简洁,“语法糖”使我们可以更加简洁、快速的实现这些功能。 只是Python解释器会把这些特定格式的语法翻译成原本那样复杂的代码逻辑 我们使用的语法...

sinat_23880167
2017/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

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

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

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

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部