scala学习笔记之 scala多重继承中的混入顺序和对象调用顺序说明
来源:互联网 发布:淘宝账号被永久限制 编辑:程序博客网 时间:2024/05/21 10:57
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
实验结果与推导结果一致
腾讯微云:http://url.cn/SsEg4c
360云盘:http://yunpan.cn/ccKY9miUbxT7U 访问密码 989f
百度云:http://pan.baidu.com/s/1pJ20FbH
- scala学习笔记之 scala多重继承中的混入顺序和对象调用顺序说明
- Scala特质的混入顺序
- Scala讲座:混入多重继承、类型层次和集合
- Scala学习第十五天 Scala多重继承、多重继承构造器执行顺序及AOP实现
- scala-15Scala多重继承、多重继承构造器执行顺序及AOP实现
- Dt大数据梦工厂王家林老师 Scala实战详解之第15讲 Scala多重继承、多重继承构造器执行顺序及AOP实现
- scala学习:scala中的继承
- Scala多重继承、多重继承构造器执行顺序及AOP实现
- 0015.scala的多重继承、多重继承构造器执行顺序、基于trait的AOP实现
- 15.Scala多重继承、多重继承构造器执行顺序及AOP实现
- scala学习笔记-继承
- Scala入门学习之【类,对象,继承】
- scala基础17-多重继承/混入特质需重写抽象方法
- Scala:基于trait的多重继承构造器的执行顺序、基于trait的AOP实践
- scala中的函数、变量、集合、对象---scala学习笔记(1)
- 浅议C++对象模型:多重继承下析构函数和构造函数的调用顺序解析
- scala 学习笔记--对象
- scala学习笔记-对象
- MQTT V3.1协议规范(明哥翻译)
- 未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"
- Android的Application
- XMPP协议实现原理介绍
- 18-org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProces
- scala学习笔记之 scala多重继承中的混入顺序和对象调用顺序说明
- hdu 5045 - Contest(2014 ACM/ICPC Asia Regional Shanghai Online )概率dp
- Swift教程之运算符
- eclipse菜单没有Android Virtual Device Manager
- Sublime Text 3 快捷键精华版
- 布局之五 -- GridLayout
- 【JavaWeb程序设计】完成大作业的时候的一些功能实现
- 【笔记】Edittext禁用软键盘,但不影响其他功能
- 浅谈大型网站动态应用系统架构