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
ไม่มีความคิดเห็น:
แสดงความคิดเห็น