packagecom.learn.scala.day14
/**
* 第十四天特质
* Created by zhuqing on 2017/3/13.
*/
objectDay14Class {
defmain(args: Array[String]): Unit = {
valsavingAccount =newSavingAccount(1000)
savingAccount.withdraw(2000)
/**
* 动态的增加特质
*/
valsavingAccount2 =newSavingAccount(200)withClassInfoLoggerwithShorterLogger {
/**
* 实现特质的方法
*@return
*/
override defclassInfo():String=this.getClass.toString
override vartimeFormat:String="yyyy-MM-dd hh:mm:ss"
}
savingAccount2.withdraw(100)
valaccount =newAccount(100)
account.saveMoeny(-1);
}
}
packagecom.learn.scala.day14
importjava.text.SimpleDateFormat
importjava.util.Date
/**
* 特质中只有一个默认的无参构造方法,不能自己实现构造方法
* 特质中的方法可以实现也可以不实现,类似Java的抽象类
*
* Created by zhuqing on 2017/3/13.
*/
traitLOG {
/**
* 日志输出,实现
*
*@param message
*/
deflog(message:String) = {
println(message)
}
}
/**
* Created by zhuqing on 2017/3/13.
*/
traitClassInfoLoggerextendsLOG {
/**
* 类信息,不实现
*
*@return
*/
defclassInfo():String
/**
* 日志输出,实现
*
*@param message
*/
override deflog(message:String): Unit =super.log(this.classInfo()+"\t"+message)
}
/**
* 继承其他特质可以使用 extends
*/
traitTimeStampLoggerextendsLOG {
/**
* 抽象参数,scala中的属性跟方法有时很像
*/
vartimeFormat:String
/**
* 特质重写特质的方法必须加override
*
*@param message
*/
override deflog(message:String): Unit = {
valdate =newDate();
valdateFormat =newSimpleDateFormat("yyyy-MM-dd hh:mm:ss")
super.log(dateFormat.format(date) +"\t"+ message)
}
}
/**
* 特质里可以定义属性,类似java的抽象类
*/
traitShorterLoggerextendsLOG{
/**
* 属性也可以定义成抽象参数
*/
varmaxLength=15;
protected defsetMaxLength(maxLength:Int): Unit ={
this.maxLength= maxLength
}
/**
* 重写日志输出
*
*@param message
*/
override deflog(message:String): Unit = {
if(message.length >5) {
super.log(message.substring(0,5) +"...")
}else{
super.log(message)
}
}
}
packagecom.learn.scala.day14
importscala.beans.BeanProperty
/**
* 特质的方法不会先后覆盖,而是从后往前一个一个执行的
* Created by zhuqing on 2017/3/13.
*/
classAccount(@BeanPropertyvarbalance:Double)extendsTimeStampLoggerwithClassInfoLoggerwithShorterLogger{
/**
* 类信息,不实现
*
*@return
*/
override defclassInfo():String=this.getClass.toString
defsaveMoeny(money:Double): Unit ={
if(money<=0){
log("非法操作,不能存入"+money+"元")
}else{
balance+=money
log("成功存入"+money+"元,余额"+balance+"元")
}
}
/**
* 重写Trit的属性
*/
override varmaxLength=20;
/**
* trit的抽象属性
*/
override vartimeFormat:String="yyyy-MM-dd hh:mm:ss"
}
/**
* Created by zhuqing on 2017/3/13.
*/
classSavingAccount (@BeanPropertyvarbalance:Double)extendsTimeStampLogger{
defwithdraw(money:Double): Unit ={
if(money>balance){
this.log("余额不足!!")
}else{
balance -=money;
this.log("取款"+money+",取款成功")
}
}
override vartimeFormat:String="yyyy-MM-dd hh:mm:ss"
}