您的位置:首页 > 其它

scala 带有特质的对象 举例

2016-07-03 13:34 405 查看
1、编写Logged.scala:

trait Logged{
def log(msg:String){}
}
class BankAccount(initialBalance:Double){
//var balance=initialBalance
private var balance=initialBalance
def deposit(amount:Double)={balance+=amount;balance}
def withdraw(amount:Double)={balance-=amount;balance}
def query()=balance
}
class SavingsAccount(initialBalance:Double) extends BankAccount(initialBalance){
private var num:Int=_
def earnMonthlyInterest()={//每月执行一次
num=3 //每月有三次免手续费(1元)
super.deposit(1) //月利息1元
}
override def deposit(amount:Double)={
if(num>0){num-=1;super.deposit(amount)}
else super.deposit(amount-1)
}
override def withdraw(amount:Double)={
if(num>0){num-=1;super.withdraw(amount)}
else super.withdraw(amount+1)
}
}
class SavingsAccount2(initialBalance:Double) extends SavingsAccount(initialBalance) with Logged{
override def withdraw(amount:Double)={
//if(amount>balance){log("Insufficient funds");-1} //withdraw返回一个Double型值,操作失败时,返回-1。
//这里可以找到balance,是因为,基类里是没有private属性。但是这样做是不安全的。
if(amount>query){log("Insufficient funds");-1} //withdraw返回一个Double型值,操作失败时,返回-1。
else {log("withdraw success");super.withdraw(amount)}
}
}
trait ConsoleLogger extends Logged{
override def log(msg:String){println(msg)}
}2、在cmd下编译文件:scalac Logged.scala
3、在scala的REPL里:

scala> val acct1=new SavingsAccount2(200)
acct1: SavingsAccount2 = SavingsAccount2@1d8190

scala> acct1.withdraw(5)
res3: Double = 194.0

scala> val acct2=new SavingsAccount2(100) with ConsoleLogger
acct2: SavingsAccount2 with ConsoleLogger = $anon$1@49a1ce

scala> acct2.withdraw(5)
withdraw success
res4: Double = 94.0可以看到,能打印出来日志了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala