Scala学习第十五天 Scala多重继承、多重继承构造器执行顺序及AOP实现

来源:互联网 发布:网络防火墙品牌 编辑:程序博客网 时间:2024/04/30 11:34

1、这讲内容对做大型项目十分重要,trait本身可以有方法的实现,这样做大型工程的具体模块时,可以让这个模块混入很多不同trait,以实现这个模块功能的不同方面。
2、 PianoTeacher的构造顺序是由左往右构造的,但是已经构造了父类,后面子类的父类不会重复构造。例如TTeacher PianoPlayer继承了Human,因为Human已经被构造,所以后面只构造TTeacher、PianoPlayer本身。

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 trianing student...")      // 这里必须复写,否则无法构造对象PianoTeacher  }  object UserTrait {      def main(args: Array[String]): Unit = {          //方法一          val t1 = new PianoTeacher           /**           * 构造时结构为:           * Human           *  TTeacher           *  PianoPlayer           */          t1.playPiano  //row result: I'm playing piano....          t1.teach      //row result: I'm trianing student...          println("------------------------------------------")          //方法二 匿名类         val t2 = new Human with TTeacher with PianoPlayer{              override def teach = println("I'm teaching student...")          }          /**           * 这种方式类似于Java中定义匿名实现接口的类的简化方式           * new Interface({           *    @Override           *    public void fun(){           *      //to do something           *    }           * });           */          t2.playPiano            t2.teach             /**            *  结果为:           *  Human              TTeacher              PianoPlayer              I'm playing piano....              I'm teaching student...           */      }  }    /**   * Scala中的实现AOP   */  trait Action{      def doAction  }  trait TBeforeAfter extends Action{       /*注意 doAction虽然被复写 但仍然是abstract方法      因为super.doAction并未实现 所以用abstract关键字标识*/       abstract override def doAction {          println("Initialization")          super.doAction          println("Destroyer")      }  }  class Work extends Action{      override def doAction = println("Working...")  }  object AOP {      def main(args: Array[String]): Unit = {          val w = new Work with TBeforeAfter         //这里work实现了doAction,所以成功执行。        w.doAction          /**           * result:           *   Initialization           *   Working...           *   Destroyer           */      }  }  
0 0
原创粉丝点击