您的位置:首页 > 其它

scala学习笔记————如何实现类里的只读属性

2016-04-23 16:57 411 查看
在看《快学scala》这本书的时候 对第五章的习题2和习题8 产生疑惑:

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“可伸展”的魅力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: