在Scala特质trait的多重继承构造器执行中,执行的顺序是从左往右,即new一个Pi⁃anoTeacher对象,执行顺序为:
●先执行Human的构造器语句。
●然后执行TTeacher特质的构造器语句。
●最后执行PianoPlayer特质的构造器语句。
运行结果如图2-11所示。新建PianoTeacher对象t1,类PianoTeacher多重继承了Hu⁃man、TTeacher、PianoPlayer,实例化时从左往右先执行Human的构造器语句,打印输出Human;然后执行TTeacher特质的构造器语句,打印输出TTeacher;接着执行PianoPlayer特质的构造器语句,打印输出PianoPlayer;然后调用t1的playPiano方法,打印输出I’m pla⁃ying piano调用t1的teach方法,打印输出“I’m training students.”。
图2-11 多重继承构造器执行顺序 (www.daowen.com)
AOP(Aspect Oriented Programming)指面向切面编程,将业务逻辑和系统服务(如日志事物)进行分离,AOP的主要功能是日志记录、性能统计、安全控制、事务处理、异常处理等。在Java的Spring框架的AOP得到了大量应用。
在Scala中,AOP的设计思想可以使用特质trait来实现日志事务切面的功能。如例2-13所示。定义Action特质,拥有doAction抽象方法;定义TBeforeAfter特质,继承Action特质,然后重写doAction方法,在doAction方法中调用super.doAction方法来实现日志事物切面的功能;定义class Work类继承Action特质,重写了doAction方法。
【例2-13】Scala使用特质trait来实现日志事务切面的功能示例。
运行结果如图2-12所示。新建一个Work对象,混入TBeforeAfter特质,调用work对象的doAction方法时,先调用TbeforeAfter的doAction方法,打印输出Initialization,然后执行super的doAction方法,由于class Work继承了Action特质,因此执行super的doAction方法时候重载执行的是子类Work的doAction方法,打印输出Working…;然后接着执行super.doAction之后的语句println("Destroyed"),打印输出Destroyed。TBeforeAfter特质相当于进行了日志切面,可以在Work代码中加载自己的日志处理信息。
图2-12 AOP代码
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。