scala学习笔记————如何实现类里的只读属性
2016-04-23 16:57
411 查看
在看《快学scala》这本书的时候 对第五章的习题2和习题8 产生疑惑:
2.写一个BankAccount类 加入deposit和withdraw方法 只读的balance属性
8.
对只读属性这里产生了疑惑。2题代码一开始是
但是立马发现如此一来不能这样写deposit方法:
因为不能改变val(val的值永不改变) 的值,但是怎样实现deposit方法呢? 就回去好好翻了翻书 才看明白原来只读属性不是代表必须就是val 之前理解错了,我总结有两种方法:
1.用val修饰 这种适合对象一旦产生就不会改变的属性
2.可以写成private var …. 然后自己写出其getter方法
如本例解决方法:
如此一来就只能通过query方法来获得balance的值(只读),且没有对应的setter方法,只能通过deposit和withdraw方法更新balance属性的值
那么对于第八题 可以这样:
四组构造器,其中主构造器
然后year方法成了typeYear的getter方法 ,实现了只读属性
试试
可以发现都是满足题目要求的
学到这可或多或少领会scala“可伸展”的魅力。
2.写一个BankAccount类 加入deposit和withdraw方法 只读的balance属性
8.
对只读属性这里产生了疑惑。2题代码一开始是
class BankAccount(val balance:Int){ ... }
但是立马发现如此一来不能这样写deposit方法:
def deposit(money:Int){ balance+=money }
因为不能改变val(val的值永不改变) 的值,但是怎样实现deposit方法呢? 就回去好好翻了翻书 才看明白原来只读属性不是代表必须就是val 之前理解错了,我总结有两种方法:
1.用val修饰 这种适合对象一旦产生就不会改变的属性
2.可以写成private var …. 然后自己写出其getter方法
如本例解决方法:
class BankAccount{
private var balance=0
def deposit(money:Int){ balance+=money }
def withdraw....(类似)
def query=balance
}
如此一来就只能通过query方法来获得balance的值(只读),且没有对应的setter方法,只能通过deposit和withdraw方法更新balance属性的值
那么对于第八题 可以这样:
class Car(val vender:String,val carType:String ,private var typeYear:Int= -1,var license :String=""){ def this(vender:String,carType:String,typeYear:Int){ this(vender,carType) this.typeYear=typeYear } def this (vender:String,carType:String,license:String){ this(vender ,carType) this.license=license } def this(vender:String,carType:String,typeYear:String,license:String){ this(vender,carType,typeYear) this.license=license } def year=typeYear }
四组构造器,其中主构造器
class Car(val vender:String,val carType:String ,private var typeYear:Int= -1,var license :String=""){...}
然后year方法成了typeYear的getter方法 ,实现了只读属性
试试
var c1= new Car("ford","Suv") c1.year c1.license val c2=new Car("bench","Suv",23) c2.year val c3=new Car("totyto","cdv","A2312") c3.year c3.license val c4 = new Car("bench","cdv",12,"A3324") c4.year c4.license
可以发现都是满足题目要求的
学到这可或多或少领会scala“可伸展”的魅力。
相关文章推荐
- wcf第三方客户端与wcf服务之间调用入门
- 事务与连接池
- jquery源码中Deferred的定义的理解
- Python 中re模块学习(转)
- JAVA抽象工厂模式
- 字符串-全排序
- Leetcode 刷题: Q344 Reverse String
- 集合
- 自定义jquery函数
- C语言编程常用数值计算的高性能实现
- Leetcode no. 198
- Html和CSS的一些自我感悟(亲测,持续更新中...)
- Codeforces 390A( 模拟题)
- 1 C语言 gcc 介绍 C 语言编译 main接受参数
- 过滤器不过滤js等/待验证
- CSS选择器
- 一段源代码的旅行——程序运行背后的机制和由来
- Rebuild Future
- Vue 方法与事件处理器
- 如何配置ssh免密码登录