Scala語法詳解:特質 (Traits)
特質 (Traits) 用于在類 (Class)之間共享接口 (Interface)和字段 (Fields)。類似Java8的接口。 類和對象 (Objects)可以繼承Trait,但Trait不能被實例化,因此特質沒有參數。
定義
最簡化的就是關鍵字trait+標識符:
trait HairColor
1
特征作為泛型類型和抽象方法非常有用。
trait Iterator[A] { def hasNext: Boolean def next(): A }
1
2
3
4
擴展 trait Iterator [A] 需要一個類型 A 和實現方法hasNext和next。
使用
使用 extends 擴展Trait。然后使用 override 關鍵字實現trait里面的任何抽象成員:
trait Iterator[A] { def hasNext: Boolean def next(): A } class IntIterator(to: Int) extends Iterator[Int] { private var current = 0 override def hasNext: Boolean = current < to override def next(): Int = { if (hasNext) { val t = current current += 1 t } else 0 } } val iterator = new IntIterator(10) iterator.next() // returns 0 iterator.next() // returns 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
這個類 IntIterator 將參數 to 作為上限。它擴展了 Iterator [Int],這意味著方法 next 必須返回一個Int。
子類型
凡是需要特質的地方,都可以由該特質的子類型來替換。
import scala.collection.mutable.ArrayBuffer trait Pet { // 抽象字段 val name: String } // name 由Cat和Dog的構造器實現 class Cat(val name: String) extends Pet class Dog(val name: String) extends Pet val dog = new Dog("Harry") val cat = new Cat("Sally") val animals = ArrayBuffer.empty[Pet] animals.append(dog) animals.append(cat) // 調用pet.name的前提是它必須在特質Pet的子類型中得到了實現。 animals.foreach(pet => println(pet.name))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Scala
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。