Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง Traits และ Abstract Classes ใน Scala

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 ไม่สามารถซ้อนได้และผูกแบบสแตติก