วันอังคารที่ 12 พฤษภาคม พ.ศ. 2558

Extends Class and Implement Interface

วันนี้เราจะมาดูวิธีการ Mixin อีกแบบที่เรียกว่า Mixin Class Composition หรือที่เราเข้าใจง่ายๆ คือ การที่ class extends supper class แล้ว implement interface อีกด้วย ขอยกตัวอย่างจากบทความที่แล้วมาใช้ แต่ใช้ extends แทน สังเกตุว่าเราใช้ with Logger  แทน

เราอาจจะอ่าน ง่ายๆ เป็นภาษาอังกฤษ ได้อย่างข้างล่างนี้

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#



ไม่มีความคิดเห็น: