Scala_Trait特征

1,scala提供的“特征”能够同时拥有抽象方法和具体方法,一个类能够拥有多个特质ide

2,类能够经过“extends”关键字继承trait,继承trait后必须实现trait中的全部抽象方法,而不是用 override 关键字this

3,scala的类只能单继承,单能够继承多个trait,trait之间使用 with 关键字链接spa

 

 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 关键字使用父类中的字段。scala

5,继承多个trait的时候,整体构造原则是“从左到右,从父到子构造从右到左,从子到父调用”。code

6,自身类型(selftype)对象

有不少特质不是全部类都能随随便便继承的,例如异常类所能继承的特质,其余类继承并不合适,因此须要对特质加以约束。blog

经过“this : T => {}”的形式,指定这个特质只能被T或T的子类继承继承

也能够经过“this : {}  => {}”的形式,指定这个特质能被继承的规则,“this : {}”中的“{}”就能够设置规则,好比必须拥有指定对象、方法的类才能继承这个特质。get

须要注意的是,只能定义一次自身类型,不能定义多个thisit

相关文章
相关标签/搜索