package com.learn.scala.day14/** * 第十四天特质 * Created by zhuqing on 2017/3/13. */object Day14Class { def main(args: Array[String]): Unit = { val savingAccount = new SavingAccount(1000) savingAccount.withdraw(2000) /** * 动态的增加特质 */ val savingAccount2 = new SavingAccount(200) with ClassInfoLogger with ShorterLogger { /** * 实现特质的方法 * @return */ override def classInfo(): String = this.getClass.toString } savingAccount2.withdraw(100) val account = new Account(100) account.saveMoeny(-1); }}
package com.learn.scala.day14import java.text.SimpleDateFormatimport java.util.Date/** * 特质中只有一个默认的无参构造方法,不能自己实现构造方法 * 特质中的方法可以实现也可以不实现,类似Java的抽象类 * * Created by zhuqing on 2017/3/13. */trait LOG { /** * 日志输出,实现 * * @param message */ def log(message: String) = { println(message) }}/** * Created by zhuqing on 2017/3/13. */trait ClassInfoLogger extends LOG { /** * 类信息,不实现 * * @return */ def classInfo(): String /** * 日志输出,实现 * * @param message */ override def log(message: String): Unit = super.log(this.classInfo()+"\t"+message)}/** * 继承其他特质可以使用 extends */trait TimeStampLogger extends LOG { /** * 抽象参数,scala中的属性跟方法有时很像 */ var timeFormat:String /** * 特质重写特质的方法必须加override * * @param message */ override def log(message: String): Unit = { val date = new Date(); val dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss") super.log(dateFormat.format(date) + "\t" + message) }}/** * 特质里可以定义属性,类似java的抽象类 */trait ShorterLogger extends LOG{ /** * 属性也可以定义成抽象参数 */ var maxLength = 15; protected def setMaxLength(maxLength:Int): Unit ={ this.maxLength = maxLength } /** * 重写日志输出 * * @param message */ override def log(message: String): Unit = { if (message.length > 5) { super.log(message.substring(0, 5) + "...") } else { super.log(message) } }}
package com.learn.scala.day14import scala.beans.BeanProperty/** * 特质的方法不会先后覆盖,而是从后往前一个一个执行的 * Created by zhuqing on 2017/3/13. */class Account(@BeanProperty var balance:Double) extends TimeStampLogger with ClassInfoLogger with ShorterLogger{ /** * 类信息,不实现 * * @return */ override def classInfo(): String = this.getClass.toString def saveMoeny(money:Double): Unit ={ if(money<=0){ log("非法操作,不能存入"+money+"元") }else{ balance+=money log("成功存入"+money+"元,余额"+balance+"元") } } /** * 重写Trit的属性 */ override var maxLength = 20; /** * trit的抽象属性 */ override var timeFormat: String = "yyyy-MM-dd hh:mm:ss"}/** * Created by zhuqing on 2017/3/13. */class SavingAccount (@BeanProperty var balance:Double) extends TimeStampLogger{ def withdraw(money:Double): Unit ={ if(money>balance){ this.log("余额不足!!") }else{ balance -=money; this.log("取款"+money+",取款成功") } } override var timeFormat: String = "yyyy-MM-dd hh:mm:ss"}