scala之-初始化对象时动态混入叠加特质 new C() with T1 withT2 ..

scala之-初始化对象时动态混入叠加特质

  • extends with with with …
 * 在动态混入叠加特质的时候,如果特质中调用super.insert(i),
 * 那么这个super首先会调用左边特质的insert(i),而不一定是父类的。
 * 只有当当前特质的左边没有特质的时候,或者左边特质没有该方法时才会调用该特质的父类的insert(i)
 *
 * 叠加特质的声明:从左往右 new C1() with T1 with T2 ....
 * 叠加特质执行super.xx:从右往左执行,
 * 初始化一个类的实例时,会递归先调用父类的构造器(只要是在构造器中的变量、成员都会被初始化。),与Java一样!
object DieJiatrait {
  def main(args: Array[String]): Unit = {

    /**
     * 在动态混入叠加特质的时候,如果特质中调用super.insert(i),
     * 那么这个super首先会调用左边特质的insert(i),而不一定是父类的。
     * 只有当当前特质的左边没有特质的时候,才会调用该特质的父类的insert(i)
     *
     * 叠加特质的声明:从左往右 new C1() with T1 with T2 ....
     * 叠加特质执行super.xx:从右往左执行,
     * 初始化一个类的实例时,会递归先调用父类的构造器(只要是在构造器中的变量、成员都会被初始化。),与Java一样!
     */
    /**
     *
    T1
    T2
    T3
    T4
    (插入数据 ,1)
     */
    val c = new C() with T3 with T4
    c.insert(1)

    //    val c1: C1 with T3 with T4 = new C1 with T3 with T4 {
    //      override def say(): Unit = ???
    //    }
    //
    //    c1.insert(100)
    //    c1.say()
  }
}

//声明一个类,到时候用来动态混入特质,抽象类也可以在实例化的时候动态混入特质
class C {}

//声明一个抽象方法
abstract class C1 {
  def say()
}

//特质1
trait T1 {
  println("T1")

  def insert(i: Int)
}

//特质2
trait T2 extends T1 {
  println("T2")

  override def insert(i: Int): Unit = {
    println("插入数据 ", i)
  }
}

//特质3
trait T3 extends T2 {
  println("T3")

  //实际上是调用父特质的方法T2 :super.insert(i)
  override def insert(i: Int): Unit = super.insert(i)
}

//特质4
trait T4 extends T2 {
  println("T4")

  //实际上是调用左边的特质的方法T3 :super.insert(i)
  override def insert(i: Int): Unit = super.insert(i)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值