Scala:基于trait的多重继承构造器的执行顺序、基于trait的AOP实践
2015-07-21 00:30
585 查看
多重继承
package kmust.hjr.learningScala15 /** * Created by Administrator on 2015/7/20. */ class Human{ println("Human") } trait TTeacher extends Human{ println("TTeacher") def teach } trait PianoPlayer extends Human{ println("PianoPlayer") def playPiano={println("I'm playing piano.")} } class PianoTeacher extends Human with TTeacher with PianoPlayer{ override def teach={println("I'm training students. ")} }
实例一
object UseTrait { def main(args:Array[String]): Unit ={ val t1=new PianoTeacher t1.playPiano t1.teach } }
**说明(1):** class PianoTeacher extends Human with TTeacher with PianoPlayer{...}的构造顺序为:**从左向右**。 即:先构造Human ,在构造TTeacher ,之后构造PianoPlayer。
说明(2): 在构造TTeacher的时候,发现它的父类Human已经被构造,就不会再重复构造(这是Scala特有的), 同理,构造TTeacher的时候,发现它的父类Human已经被构造,则不必重复构造。
实例二
object UseTrait { def main(args:Array[String]): Unit ={ val t1=new PianoTeacher t1.playPiano t1.teach val t2= new Human with TTeacher with PianoPlayer{ def teach={println("I'm teaching students.")} } t2.playPiano t2.teach } }
AOP
package kmust.hjr.learningScala15 /** * Created by Administrator on 2015/7/20. */ /*AOP*/ trait Action{ def doAction } trait TBeforeAfter extends Action{ abstract override def doAction: Unit ={ println("Initialization") super.doAction println("Destroyed") } } class Work extends Action{ override def doAction=println("Working...") }
object UseTrait { def main(args:Array[String]): Unit ={ val work=new Work with TBeforeAfter work.doAction } }
完整代码
package kmust.hjr.learningScala15 /** * Created by Administrator on 2015/7/20. */ class Human{ println("Human") } trait TTeacher extends Human{ println("TTeacher") def teach } trait PianoPlayer extends Human{ println("PianoPlayer") def playPiano={println("I'm playing piano.")} } class PianoTeacher extends Human with TTeacher with PianoPlayer{ override def teach={println("I'm training students. ")} }
/*AOP*/
trait Action{
def doAction
}
trait TBeforeAfter extends Action{
abstract override def doAction: Unit ={
println("Initialization")
super.doAction
println("Destroyed")
}
}
class Work extends Action{
override def doAction=println("Working...")
}
object UseTrait {
def main(args:Array[String]): Unit ={
/* val t1=new PianoTeacher
t1.playPiano
t1.teach
val t2= new Human with TTeacher with PianoPlayer{
def teach={println("I'm teaching students.")}
}
t2.playPiano
t2.teach*/
val work=new Work with TBeforeAfter
work.doAction
}
}
附件 :
相关文章推荐
- Gym 100712I Bahosain and Digits(枚举)
- LightOJ1038-Race to 1 Again
- 003.main 主函数文件
- 对于atomic nonatomic assign retain copy strong weak的简单理解
- POJ 3835 Columbus's bargain(最短路)
- icvGetHaarTrainingData详细解析
- x86 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
- pthread_cond_signal和pthread_cond_wait简介
- poj3735 Training little cats
- POJ题目2585Window Pains(拓扑排序)
- 11.Container With Most Water (Array; Two-Pointers)
- PAT (Advanced Level) 1014. Waiting in Line (30) 银行排队
- Snail—OC学习之可变字符串NSMutableString
- Bahosain and Digits
- hdoj1021Fibonacci Again
- 开关翻转 Gym100712I Bahosain and Digits
- http://blog.csdn.net/ynnmnm/article/details/38392795
- Installation error: INSTALL_FAILED_CONTAINER_ERROR
- 【算法渣渣的逆袭之路】summer training warmming up,暑假的集训要开始啦,先来几道题热热身
- Snail—OC学习之字符串NSString