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可以看到,能打印出来日志了。
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可以看到,能打印出来日志了。
相关文章推荐
- Windows下Scala环境搭建
- Windows7下安装Scala 2.9.2教程
- Scala代码实现列出Hadoop 文件夹下面的所有文件
- ClassNotFoundException:scala.PreDef$
- sbt创建web项目
- XML 文件解析--含Unicode字符的XML文件
- Scala 学习随笔
- Scala 小程序记录(学习期间的代码片段)
- Spark机器学习(二) 局部向量 Local-- Data Types - MLlib
- Spark机器学习(三) Labeled point-- Data Types
- 分分钟掌握快速排序(Java / Scala 实现)
- Scala极速入门
- Spark初探
- Scala实现REST操作
- Scala method call syntax
- 关于Scala多重继承的菱形问题
- Scala 高阶函数(high-order function)剖析
- Scala Monad Design Pattern
- Scala类型系统——高级类类型(higher-kinded types)
- Spray.io搭建Rest服务