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

Abstract class

ในภาษา Scala เราสามารถประกาศให้ class เป็น abstract ได้ วิธีการใช้ abstract class ก้อคล้ายกันกับ java หรือ c# เราลองมาดูตัวอย่างกันดังต่อไปนี้

abstract class Vehicle(val maximumSpeed : Int, var speed : Int) {
  def speedUp(x:Int)
}
class Truck extends Vehicle(80, 0) {
  def speedUp(x:Int) {
    speed += x
  }
}

object Hello {
  def main(args: Array[String]) {
   val t = new Truck()
   println(s"${t.maximumSpeed}, ${t.speed}")
   t.speedUp(100)
   println(s"${t.maximumSpeed}, ${t.speed}")  
  }
}

ในตัวอย่างนี้จะพิมพ์ข้อความข้างล่างนี้ออกมา

80, 0
80, 100

เราประกาศให้ Vehicle เป็น abstract class โดยที่ maximumSpeed และ speed เป็น abstract property และ  speedUp เป็น abstract method คลาสใดๆ ก้อตามที่ extends ไปใช้งานจะต้องระบุค่าของ maximumSpeed และ speed รวมถึง เขียนโค๊ดให้กับ เมทธอด รันด้วย 

จากตัวอย่างข้างต้นหากว่า Truck extends Vehicle โดยที่ไม่ทำอะไรเลย Truck จะต้องประกาศให้เป็น abstract ไปด้วย

ต่อไปเราจะมาดูอีกตัวอย่างหนึ่งในกรณีที่ abstract class มี primary constructor

abstract class Vehicle(val maximumSpeed : Int, var speed : Int) {
  def speedUp(x:Int)
}

class Truck extends Vehicle(80, 0) {
  def speedUp(x:Int) {
    speed += x
  }
}

จะเห็นได้ว่า Truck ไม่จำเป็นต้องประกาศ maximumSpeed และ speed อีกต่อไป และค่าของทั้งคู่จะถูกกำหนดให้เป็น 80 และ 0 ตามลำดับตอนที่เราสร้าง instance ของ Truck 

ภาษา Scala  ก้อเหมือนกัน java หรือ c# ที่ไม่อนุญาติให้ใช้ multiple inheritance และที่สำคัญ ภาษา Scala ไม่ interface อีกด้วย แต่ Scala มี Trait ที่คล้ายๆ กับ interface แต่มีประสิทธิภาพมากกว่าให้ใช้
เมื่อไหร่ก้อตามที่เราตั้งใจจะใช้ abstract class เราควรจะใช้ Trait จะดีกว่า เอาไว้เมื่อถึงหัวข้อ Trait แล้วผมจะอธิบายให้ฟังว่าทำไม

สำหรับหัวข้อต่อไป ยังคงเป็นเรื่อง abstract แต่คราวนี้เป็น abstract type


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