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

相關文章
相關標籤/搜索