เราอาจจะอ่าน ง่ายๆ เป็นภาษาอังกฤษ ได้อย่างข้างล่างนี้
class FileDataSource extends (DataSource with Logger)
abstract class DataSource {
def otherMethod()
def read() : Boolean
def getString() : String
def printAll() {
while(this.read()) {
println(getString())
}
}
}
trait Logger {
def otherMethod() {}
def write(message: String) {
println(message)
}
}
class FileDataSource extends DataSource with Logger {
val max = 5
var count : Int = 0
def read() :Boolean = {
count = count + 1
return count < max
}
def getString():String = {
return "count=> " + count
}
}
ทีนี้เราลองมาดูวิธีใช้งานกัน คราวนี้เราสร้าง instance ของ FileDataSource โดยไม่มี with อีกแล้ว
object Hello {
def main(args: Array[String]) {
var a =new FileDataSource()
a.printAll()
a.write("done")
}
}
ข้อดีของ การ Mixin Class Compostion คือ การทำ multiple inheritance โดยอ้อมนั่นเอง อย่าลืมว่า Trait ไม่ใช่ interface ดังนั้นมันมีเมทธอดที่มี implementation (โค๊ด) และถ่ายทอดมาให้ subclass ใช้งานได้ ทีนี้ถ้าเกิดว่าเรา Mixin 2 interface ที่มีเมทธอดเหมือนกันแต่ implementation ต่างกันล่ะ ลองมาดูตัวอย่างข้างล่างกัน
trait OtherLogger {
def write(message:String) {
println("--->" + message)
}
}
class FileDataSource extends DataSource with Logger with OtherLogger {
...
เราจะ compile ไม่ผ่านครับ เนื่องจาก inheritance config จะเห็นได้ว่า เราทำ multiple inheritance ได้แต่ก้อยังคงกติกาที่ใช้เหมือนกับ single inheritance และนี่ทำให้ Scala flexible กว่า java และ c#
ไม่มีความคิดเห็น:
แสดงความคิดเห็น