Traits
Traits คล้ายกับ interfaces ใน Java และสร้างด้วยคีย์เวิร์ด trait
Abstract Class
Abstract Class คล้ายกับ abstract classes ใน Java และสร้างด้วยคีย์เวิร์ด abstract
ตัวอย่าง
โปรแกรม Scala ต่อไปนี้แสดงการใช้งาน Traits และ Abstract Classes:
trait SampleTrait {
// Abstract method
def test
// Non-Abstract method
def tutorials() {
println("Traits tutorials")
}
}
abstract class SampleAbstractClass {
// Abstract method
def test
// Non-abstract method
def tutorials() {
println("Abstract Class tutorial")
}
}
class Tester extends SampleAbstractClass {
def test() {
println("Welcome to Tutorialspoint")
}
}
class TraitTester extends SampleTrait {
def test() {
println("Welcome to Tutorialspoint")
}
}
object HelloWorld {
// Main method
def main(args: Array[String]) {
var obj = new Tester()
obj.tutorials()
obj.test()
var obj1 = new TraitTester()
obj1.tutorials()
obj1.test()
}
}
ผลลัพธ์
Abstract Class tutorial Welcome to Tutorialspoint Traits tutorials Welcome to Tutorialspoint
ต่อไปนี้คือความแตกต่างสำคัญระหว่าง Traits และ Abstract Classes ใน Scala:
| ลำดับ | คีย์ | Trait | Abstract Class |
|---|---|---|---|
| 1 | การสืบทอดหลายตัว (Multiple inheritance) | Trait รองรับการสืบทอดหลายตัว | Abstract Class รองรับการสืบทอดเดียวเท่านั้น |
| 2 | อินสแตนซ์ (Instance) | Trait สามารถเพิ่มเข้าไปในอินสแตนซ์ออบเจ็กต์ได้ | Abstract class ไม่สามารถเพิ่มเข้าไปในอินสแตนซ์ออบเจ็กต์ได้ |
| 3 | พารามิเตอร์คอนสตรัคเตอร์ (Constructor parameters) | Trait ไม่สามารถมีพารามิเตอร์ในคอนสตรัคเตอร์ได้ | Abstract class สามารถมีคอนสตรัคเตอร์ที่รับพารามิเตอร์ได้ |
| 4 | การทำงานร่วมกับ Java (Interoperability) | Traits ทำงานร่วมกับ Java ได้หากไม่มีการนำไปใช้ (implementation) | Abstract classes ทำงานร่วมกับ Java ได้โดยไม่มีข้อจำกัด |
| 5 | การซ้อนได้ (Stackability) | Traits สามารถซ้อนได้และผูกแบบไดนามิก | Abstract classes ไม่สามารถซ้อนได้และผูกแบบสแตติก |