trait Logger { def log(msg: String) } //子特质实现父特质里面的抽象方法 trait ConsoleLogger extends Logger { override def log(msg: String): Unit = println(msg) } //给日志加上一个时间戳 trait TimestampLogger extends ConsoleLogger { override def log(msg: String): Unit = super.log(s"${java.time.Instant.now()}$msg") } //如果日志过长,对日志进行截断显示 trait ShortterLogger extends ConsoleLogger { val maxLength = 15 override def log(msg: String): Unit = super.log( if (msg.length maxLength) msg else s"${msg.substring(0, maxLength - 3)}..." ) } class Account { protected var balance: Double = 0.0 } class SavingAccount extends Account with ConsoleLogger { def withdraw(ammount: Double): Unit = { if (ammount > balance) log("Insffient funds") else balance = balance - ammount } } //特质的应用 object TraitTest2 { //特质可以为类提供可以堆叠的改变 def main(args: Array[String]): Unit = { var acc1 = new SavingAccount with ConsoleLogger with TimestampLogger with ShortterLogger var acc2 = new SavingAccount with ConsoleLogger with ShortterLogger with TimestampLogger acc1.withdraw(100) acc2.withdraw(100) println("***************************") var acc3 = new SavingAccount with ConsoleLogger var acc4 = new SavingAccount with ConsoleLogger with TimestampLogger var acc5 = new SavingAccount with ConsoleLogger with ShortterLogger acc3.withdraw(100) acc4.withdraw(100) acc5.withdraw(100) } } |
scala自学之路-26-特质的应用01
该博客介绍了如何在Scala中通过特质(trait)来实现不同的日志记录功能,如控制台日志、时间戳日志和日志截断。通过特质的组合,创建了不同特性的日志记录器,并在`SavingAccount`类中应用这些特质,展示了特质的堆叠和多态性。示例代码中展示了如何在`TraitTest2`对象中使用不同组合的日志记录器来跟踪账户交易。
摘要由CSDN通过智能技术生成