基于trait的多重继承构造器的执行顺序、基于trait的AOP实践

多重继承

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

  }
}

附件 :

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值