ก่อนอื่นต้องบอกว่าใน ภาษา Scala เราสามารถ Mixin class (mix methods and properties into some class) โดยการใช้ Trait และ keyword with
เรามาดูตัวอย่างกัน คราวนี้ FileDataSource ไม่ได้ extends DataSource อีกต่อไป สังเกตุว่า DataSource มีเมทธอด otherMethod แต่ FileDataSource ไม่มีและไม่เป็นไรเนื่องจาก FileDataSource ไม่ได้ extends DataSource
trait DataSource {
def otherMethod()
def read() : Boolean
def getString() : String
def printAll() {
while(this.read()) {
println(getString())
}
}
}
class FileDataSource {
val max = 5
var count : Int = 0
def read() :Boolean = {
count = count + 1
return count < max
}
def getString():String = {
return "count=> " + count
}
}
คราวนี้เรามี Trait เพิ่มอีกหนึ่ง และมีเมทธอด otherMethod และ write
trait Logger {
def otherMethod() {}
def write(message: String) {
println(message)
}
}
เรามาดูวิธี Mixin กัน ผมอยากจะ Mix in printAll จาก DataSource และ write จาก Logger ไปให้ FileDataSource ได้ใช้โดยที่ไม่ต้องการ inheritance เราทำได้ดังนี้
object Hello {
def main(args: Array[String]) {
var a =new FileDataSource() with DataSource with Logger
a.printAll()
a.write("done")
}
}
จะเห็นได้ว่าผมสร้าง instance ของ FileDataSource (ที่ไม่ได้ประกาศ printAll และ write) และ mix in DataSource และ Logger ให้ ด้วย keyword with หลังจากที่สร้าง instance a แล้ว ผมเรียกเมทธอด printAll จาก DataSource และ write จาก Logger ผลลัพธ์ที่พิมพ์ออกมาคือ
count=> 1
count=> 2
count=> 3
count=> 4
done
ไม่มีความคิดเห็น:
แสดงความคิดเห็น