文档章节

函数式对象之添加字段

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

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 202
博文 394
码字总数 347782
作品 0
杭州
技术主管
F#探险之旅(四):面向对象编程(中)

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

长征3号 ⋅ 2017/12/13 ⋅ 0

Golang 学习笔记(5)—— 面向对象编程

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

ChainZhang ⋅ 2017/12/25 ⋅ 0

重构-改善既有代码设计

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

zhchl2010 ⋅ 2015/12/24 ⋅ 0

JavaScript总结3

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

fzyz_sb ⋅ 2016/12/17 ⋅ 0

推特开源的Serial,轻量级,快速的json解析框架

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

阿韦爱Android ⋅ 2017/11/22 ⋅ 0

Go基础编程:面向对象—方法

1 概述 在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种带有接收者的函数,我们称为方法(method)。 本质上,一个方法则是一个和特殊类型关...

tennysonsky ⋅ 2017/12/28 ⋅ 0

Replace Inheritance with Delegation (以委托取代继承)

某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系 动机: 继承是个好东西...

忆瑶 ⋅ 2014/02/28 ⋅ 0

C#基础知识系列五(构造函数)

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

aehyok ⋅ 2014/01/13 ⋅ 0

《Visual C# 2010 Step By Step》前14章学习总结

1、为方法指定一个可选参数: void method(int arg1, double arg2 = 0.0, string arg3 = ""){ } 2、利用命名参数向方法提供一个实参: method(arg1 : 100, arg3 : "hello"); 3、如下代码,如...

Silent丶Kai ⋅ 2012/02/25 ⋅ 0

Go 语言教程(4)——数据结构

Array 和其他语言的数组不同。 数组是值类型,赋值和传参会复制整个数组,而不是指针。 数组长度必须是常量,且是类型的组成部分。 和 是不同类型。 支持 、 操作符,因为内存总是被初始化过...

流年1004 ⋅ 01/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 16分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 17分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 28分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 30分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 32分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 33分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部