关闭

scala学习笔记之 scala多重继承中的混入顺序和对象调用顺序说明

标签: scala多重继承中的混入顺序和对象调用
943人阅读 评论(0) 收藏 举报

1>、scala中多重继承中方法的混入是由左往右的顺序。(见以下实例讲解)
2>、scala中多继承对象方法的调用顺序是从右往左。(见以下实例讲解)

AOPScala.scala

 

trait Action{
  def doAction
}
trait toBefo extends Action{
  abstract  override def doAction {
    println("toBefo function")
    super.doAction
    println("toBefo function over")
  }
}

trait toBefo2 extends Action with toBefo{
  abstract override def doAction={
    println("toBefo2 function")
    super.doAction
    println("toBefo2 function over")
  }
}
class Worker extends Action{
  override def doAction=println("working .........")
}
object AOPScala {
  def main(args: Array[String]) {
    val work=new Worker with toBefo with toBefo2
    work.doAction
    }

   
混入顺序讲解:1>、work对象是创建自Worker类的。
                               2>、Worker类混入了Action特质(本文中继承trait称为“混入”,继承class称为“继承”),而Action特质中有一个抽象方法doAction,因此此时混入了Action特质中的doAction方法,且在Worker中实现了doAction方法,打印“working .........”。
                              3>、创建worker对象时,紧接着又混入了toBefo特质,toBefo特质混入了Action特质,此时理论上说这时会混入Action特质的doAction方法,但在前面Action特质的doAction方法已混入了,因此在此就不需要在此混入了,紧接着toBefo特质实现了Action特质中的doAction方法开始打印“toBefo function”,
                  而后又通过super.doAction调用父特质(Action)中的doAction方法,因为父特质中该方法为抽象方法(没有方法体),因此此时toBefo2特质的doAction虽然重写了doAction方法,且有方法体,但又同时调用了父特质的抽象方法(我称之为 “未完全实现”),因此toBefo特质的doAction方法上必须要机上abstract关键字标记,在super.doAction后继续打印了“toBefo2 function over”,Worker类混入了toBefo特质的doAction方法。
                             4>、创建worker对象时,在混入toBefo特质后,又混入了toBefo2特质,toBefo2特质有先后混入了Action特质和toBefo特质,理论上是此时混入了Action特质和toBefo特质的doAction方法,但1、2步中已混入因此在这儿不需要重新混入;紧接着toBefo2特质重写了doAction方法,打印“toBefo2 function”,紧接着是super.doAction,调用父特质(Action特质)的doAction方法,因此toBefo2特质的doAction方法也需要abstract标示(原因在2步中已说明),紧接着打印了“toBefo2 function over”。
                             5>、到此Worker类的方法混入已完毕,总体而言分析多重继承的方法混入顺序时,应该是从左往右逐个分析混入的特质,如本例中是先分析toBefo特质的混入然后再分析toBefo2特质的混入,前面步骤已混入的方法,在后续混入中不再重新混入。


方法调用顺序讲解:
              1>、work对象调用doAction方法
              2>、遵循调用从右往左分析的原则,先找toBefo2特质中的doAction方法,此时打印“toBefo2 function”
              3>、接着执行toBefo2特质中doAction方法里的super.doAction 而toBefo2特质继承自toBefo特质和Action特质(遵循从右往左的顺序),先查找toBefo特质中的doAction方法,因此此时打印“toBefo function”
              4>、接着执行toBefo特质中doAction方法里的super.doAction,但在Action特质中该方法为抽象方法,因此需要找该方法的完全实现(toBefo特质和toBefo2特质均“未完全实现”该方法(原因见混入顺序讲解),最后在Worker类中完全实现了该方法),因此此时打印“working .........”
              5>、执行完toBefo特质中doAction方法里的super.doAction后打印“toBefo function over”,后跳出toBefo特质及执行完toBefo2特质中doAction方法里的super.doAction
              6>、接着执行toBefo2特质中doAction方法中最后的打印语句,打印“toBefo2 function over”
              7>、至此doAction调用完毕。
程序运行后答打印的结果为:                     
              toBefo2 function
              toBefo function
              working .........
              toBefo function over
              toBefo2 function over
             
              实验结果与推导结果一致

 

王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典”视频、音频和PPT下载!
第15讲:Scala多重继承、多重继承构造器执行顺序及AOP实现
腾讯微云:http://url.cn/SsEg4c
360云盘:http://yunpan.cn/ccKY9miUbxT7U  访问密码 989f
百度云:http://pan.baidu.com/s/1pJ20FbH

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3584次
    • 积分:189
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档