黑猴子的家:Scala 叠加在一起的特质

super并不是指继承关系,而是指的加载顺序,从右到左,不一定调用父类的,而是调用左边的混入特质,左边没有了,才调用父类的

继承多个相同父特质的类,会从右到左依次调用特质的方法。Super指的是继承特质左边的特质,从源码是无法判断super.method会执行哪里的方法,如果想要调用具体特质的方法,可以指定:super[ConsoleLogger].log(…).其中的泛型必须是该特质的直接超类类型

trait Logger4 {
  def log(msg: String);
}

trait ConsoleLogger4 extends Logger4 {
  def log(msg: String) {
    println(msg)
  }
}

trait TimestampLogger4 extends ConsoleLogger4 {
  override def log(msg: String) {
    super.log(new java.util.Date() + " " + msg)
  }
}

trait ShortLogger4 extends ConsoleLogger4 {
  override def log(msg: String) {
    super.log(if (msg.length <= 15) msg else s"${msg.substring(0, 12)}...aaaa")
  }
}

class Account4 {
  protected var balance = 0.0
}

abstract class SavingsAccount4 extends Account4 with Logger4 {
  def withdraw(amount: Double) {
    if (amount > balance) log("余额不足")
    else balance -= amount
  }
}

object Main4 extends App {
  //super  特质 从右到左   ShortLogger4  ->  TimestampLogger4
  val acct1 = new SavingsAccount4 with TimestampLogger4 with ShortLogger4
  //TimestampLogger4 -> ShortLogger4
  val acct2 = new SavingsAccount4 with ShortLogger4 with TimestampLogger4
  acct1.withdraw(100)
  acct2.withdraw(100)
}

尖叫提示:抽象类混入特质,从右往左调用,super调用的是当前特质左边的特质,如果没有特质了,才调用父类的,而不是直接调用父类的方法,如果想直接调用父类的,可以加泛型限制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值