一、介绍
参考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