Tour of Scala

Traits

Language

Trait ใช้เพื่อแชร์ interface และ field ระหว่างคลาส มันจะเหมือนกับ interface ใน Java 8 คลาส และ object สามารถขยาย trait ได้แต่ trait ไม่สามารถ instant เป็น object และไม่สามารถมี parameter ได้

การกำหนด trait

วิธีที่ง่ายที่สุดในการกำหนด trait คือการประกาศด้วย keyword trait และ indentifier:

trait HairColor 

trait จะมีประโยชน์อย่างยิ่งด้วยการเป็น generic type และเป็น abstract method

trait Iterator[A] { def hasNext: Boolean def next(): A } 

การขยาย trait Iterator[A] ต้องการ type A และ implementation ของ method hasNext และ next

การใช้ traits

ใช้ keyword extends เพื่อขยาย trait ดังนั้นจะ implement abstract member ใดๆ ของ trait โดยใช้ keyword override:

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 

คลาส IntIterator นี้รับค่า parameter to เป็น upper bound มัน extends Iterator[Int] ซึ่งหมายความว่า method next จะต้อง return เป็น Int

Subtyping

ในเมื่อ trait ที่ให้มานั้น required, subtype ของ trait สามารถถูกใช้แทนที่ได้

import scala.collection.mutable.ArrayBuffer trait Pet { val name: String } 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) animals.foreach(pet => println(pet.name)) // แสดงค่า Harry Sally 

trait Pet มี abstract field name ซึ่ง implement โดย Cat และ Dog ใน constructor ของมัน ในบรรทัดสุดท้าย เราเรียก pet.name ซึ่งจะต้องถูก implement แล้วใน subtype ใดๆ ของ trait Pet

Contributors to this page: