1,scala提供的“特征”可以同时拥有抽象方法和具体方法,一个类可以拥有多个特质
2,类可以通过“extends”关键字继承trait,继承trait后必须实现trait中的所有抽象方法,而不是用 override 关键字
3,scala的类只能单继承,单可以继承多个trait,trait之间使用 with 关键字连接
1 package scalaTest 2 3 object TraitApp{ 4 // 创建trait 5 trait trait1{ 6 // 没有具体实现的方法 7 def sayTrait(name : String) 8 // 有具体实现的方法 9 def sayHello = println("nice to meet you") 10 } 11 12 trait tarit2{ 13 def sysTrait2(age : Int) 14 } 15 16 trait trait3{ 17 def sysTrait3(num : Int) 18 } 19 20 class Person(private var name : String) extends trait1 with tarit2{ 21 def getName = name 22 def sayTrait(name : String) = println("Hello " + name) 23 def sysTrait2(age : Int) = println(name + " is " + age) 24 } 25 26 def main(args: Array[String]): Unit = { 27 val p = new Person("trait") 28 p.sayTrait(p.getName) 29 p.sysTrait2(33) 30 p.sayHello 31 32 // 可在创建对象时用with 33 val p1 = new Person("TRAIT") with trait3{ 34 def sysTrait3(num : Int) = println(num) 35 } 36 p1.sysTrait3(33) 37 } 38 }
4,trait中可定义抽象字段(没有初始化的字段)和具体的字段(已经初始化了的字段), 类继承了trait后,必须实现抽象字段,即初始抽象字段,类中可以直接使用trait中字段。而类继承了类,需使用 super 关键字使用父类中的字段。
5,继承多个trait的时候,总体构造原则是“从左到右,从父到子构造;从右到左,从子到父调用”。
6,自身类型(selftype)
有很多特质不是所有类都能随随便便继承的,例如异常类所能继承的特质,其他类继承并不合适,所以需要对特质加以约束。
通过“this : T => {}”的形式,指定这个特质只能被T或T的子类继承
也可以通过“this : {} => {}”的形式,指定这个特质能被继承的规则,“this : {}”中的“{}”就可以设置规则,比如必须拥有指定对象、方法的类才能继承这个特质。
需要注意的是,只能定义一次自身类型,不能定义多个this