scala25:利用特质扩展对象的功能,动态的混入特质,功能增强

提示

特质可以为类提供堆叠的改变,要什么功能,混入不同的特质

特点

定义一个父接口,实现一个基础功能。
然后针对这个基础实现在扩展出多种增强实现,在创建对象时,通过with不断混入需要的特质,可以在基础功能上应用所有混入的功能

在这里插入图片描述
在这里插入图片描述

trait LoggerTrait {
  //日志统一接口
  def log(msg:String):Unit
}

//子特质可以实现父特质的方法
trait ConsoleLogger extends LoggerTrait{
  override def log(msg: String): Unit = {
    println(s"在控制台打印日志:$msg")
  }
}

//增强记录日志方法,可以记录带有时间戳的日志
trait TimeStampLogger extends ConsoleLogger{
  //在控制台打印的的日志带有时间戳,可以调用java的对象
  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 = {
    if(msg.length <= maxLength) super.log(msg)
    else
      super.log(s"${msg.substring(0,maxLength-1)}...")
  }
}

//定义一个对象,希望给对象增加记录日志的方法
class Account {
  protected var balance:Double = 0.0
}

class SavingAccount extends Account with ConsoleLogger{
//class SavingAccount extends Account with TimeStampLogger{
//class SavingAccount extends Account with ShortterLogger{
  def withdraw(amount:Double):Unit = {
    if(amount>balance)
      log("钱不够")
    else
      this.balance -= amount
  }
}
object APP extends App {
  val acc1 = new SavingAccount();
  acc1.withdraw(100);
  //动态的混入
  //在创建对象的时候混入特质,改变对象中的特定方法
  var acc2 = new SavingAccount() with TimeStampLogger
  acc2.withdraw(100)
  //从后往前调用
  var acc3 = new SavingAccount() with TimeStampLogger with ShortterLogger
  acc3.withdraw(100)
  //从后往前调用
  var acc4 = new SavingAccount()  with ShortterLogger with TimeStampLogger
  acc4.withdraw(100)
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值