abstract class MyPoint {
type T //มี T แต่ยังไม่รู้ว่าเป็น type อะไร
var value : T //มี value ที่ประกาศว่าเป็นตัวแปรแบบ T
def print() {
println(value)
}
}
class Score extends MyPoint {
type T = Int //T เป็น Int
var value = 0
}
class Point extends MyPoint {
type T = (Int, Int) //T เป็น (int, int)
var value = (0,0)
}
เราประกาศ class MyPoint โดยที่ MyPoint มีการประกาศว่าเราจะมี value ที่เป็นข้อมูลชนิด T อย่างไรก้อตามเรายังไม่รู้ว่าเราจะใช้ T เป็น Int, Double, String ... เราจึงประกาศว่า เรายังไม่รู้ ณ ตอนนี้ เราใช้
type T
และประกาศให้ MyPoint เป็น abstract ถัดมาเราประกาศ class Score โดยที่ Score extends มาจาก MyPoint คราวนี้ Score ประกาศว่า T เป็น Int และ value เป็นค่าศูนย์
type T = Int
var value = 0
เรายังประกาศ Point เพิ่มอีก โดยที่ extends มาจาก MyPoint เช่นกัน และให้ T เป็นชนิดข้อมูลที่เก็บค่า Int 2 ตัว หรือ (Int, Int)
var T = (Int, Int)
var value = (0,0)
หมายเหตุ: ถ้าเราอยากเก็บ Int 3 ตัวเราก้อประกาศเป็น (Int, Int, Int) และเซ็ตค่าเป็น (0,0,0)
จะเห็นได้ว่าจากตัวอย่างข้างบนเราประกาศ abstract type ใน abstract class และ subclass จะประกาศว่า type ที่จะนำไปใช้งานคือชนิดไหน เราลองมาดูตัวอย่างกันเต็มๆ อีกที
ในเมทธอด Main เราสร้าง instance ของ Score และ Point แล้วพิมพ์ค่าของ value ออกมาดังต่อไปนี้
(0,0)
0
เราสามารถเขียน abstract type ให้สั้นกว่านี้ได้โดยใช้ [T] ได้ ลองมาดูตัวอย่างต่อไปนี้เราจะเขียน MyPoint, Score และ Point ใหม่
abstract class MyPoint[T] {
var value : T
def print() {
println(this.value)
}
}
class Score extends MyPoint[Int] {
var value = 10
}
class Point extends MyPoint[(Int, Int)] {
var value = (10,10)
}
จะเห็นได้ว่า เราใช้ MyPoint[T] และ subclass Score บอกว่า T คือ Int โดย extends MyPoint[Int] และ Point ประกาศว่า T เป็น (Int, Int) โดย extends MyPoint[(Int, Int)]
เรื่องของ abstract คงมีเพียงแค่นี้ บทความต่อไปจะเป็นเรื่อง Trait
ไม่มีความคิดเห็น:
แสดงความคิดเห็น