zoukankan      html  css  js  c++  java
  • Scala入门2(特质与叠加在一起的特质)

    一、介绍

      参考http://luchunli.blog.51cto.com/2368057/1705025

      我们知道,如果几个类有某些共通的方法或者字段,那么从它们多重继承时,就会出现麻烦。所以Java被设计成 不支持多重继承,但可以实现任意多的接口。接口只能包含抽象方法,不能包含字段。

      特质 trait 是Scala中特有的一项特点,不同于C#与Java,如果一定要拿C#与Java中的某项特点作对比的话,最接近的应该是接口,但是C#与Java中的接口是不允许带有方法实现的,而Scala中的Trait是可以带有方法实现的。这样做的好处需要某个trait就拿来用,而不需要重复实现接口

      所有的Java接口都可以作为Scala特质来使用。与Java一样,Scala类只能有一个超类,可以有任意数量的特质。

      特质的定义使用保留字trait,具体语法与类定义类似,除了不能拥有构造参数

    1 trait reset {
    2     def reset (m : Int, n : Int) = if (m >= n) 1;
    3 }

      一旦特质被定义了,就可以混入到类中

    1 class week extends reset {......}

      当要混入多个特质时,利用with保留字

    1 class week extends reset with B with C {......}

      特质的成员可以是抽象的,而且不需要使用abstract声明。同样,重写特质的抽象方法无需给出override。但是,多个特质重写同一个特质的抽象方法需要给出override。
      除了在类定义中混入特质外,还可以在特质定义中混入特质

    1 trait reseting extends reset {......}

      在对象构造时混入特质

    1 val file = new month with reseting

      特质的构造是有顺序的,从左到右被构造

     1 /**
     2  * @author lucl
     3  */
     4 class Teacher {  // 实验用的空类
     5   println("===============I'm Teacher.");
     6 }  
     7  
     8 trait TTeacher extends Teacher {
     9   println("===============I'm TTeacher.")
    10   def teach;    // 虚方法,没有实现  
    11 }
    12  
    13 trait TPianoTeacher extends Teacher {
    14   println("===============I'm TPianoTeacher.")
    15   def playPiano = {                // 实方法,已实现
    16     println("I'm playing piano.");
    17   }
    18 }
    19  
    20 class PianoPlayingTeacher extends Teacher with TTeacher with TPianoTeacher {
    21   println("===============I'm PianoPlayingTeacher.")
    22   def teach = {                   // 定义虚方法的实现
    23     println("I'm teaching students.");
    24   }
    25 }
    26  
    27 object TraitOps {
    28   def main (args : Array[String]) {
    29     var p = new PianoPlayingTeacher;
    30     p.teach;
    31     p.playPiano;
    32   }
    33