Chuyển đến nội dung chính

Các Trait trong Scala

Tìm hiểu cách sử dụng trait trong Scala với các ví dụ cú pháp minh họa.
Đã cập nhật 5 thg 10, 2026  · 6 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

DataCamp vừa ra mắt khóa học Scala đầu tiên: Giới thiệu về Scala. Hãy xem ngay!

Bạn cũng có thể quan tâm đến các bài hướng dẫn sau:

Giới thiệu

Trait là một khái niệm được dùng chủ yếu trong lập trình hướng đối tượng, có thể mở rộng chức năng của một lớp thông qua một tập phương thức.

Trait tương tự về tinh thần với interface trong ngôn ngữ lập trình Java. Khác với lớp, trait trong Scala không thể được khởi tạo và không có đối số hay tham số. Tuy nhiên, bạn có thể kế thừa (mở rộng) chúng bằng các lớp và đối tượng. Nói cách khác, trait cung cấp một tập phương thức/hàm thực thi hành vi cho một lớp và kỳ vọng lớp đó triển khai một số phương thức để tham số hóa hành vi đã cung cấp.

Một trait dùng để định nghĩa đối tượng được tạo như một tổ hợp các phương thức có thể được dùng bởi nhiều lớp mà không cần đa kế thừa. Tuy nhiên, vẫn có trường hợp ngoại lệ khi hai trait có phương thức trùng tên (xung đột đặt tên) và một lớp cần sử dụng cả hai; khi đó, sự mơ hồ phải được xử lý tường minh.

Các trait có thể có cả phương thức, trường trừu tượng và không trừu tượng làm thành viên. Khi bạn không khởi tạo một phương thức trong trait thì đó là phương thức trừu tượng; còn những phương thức đã được khởi tạo được gọi là không trừu tượng. Với các phương thức trừu tượng, lớp triển khai trait sẽ chịu trách nhiệm khởi tạo.

Bây giờ, hãy nhanh chóng tìm hiểu trait trong Scala với một số ví dụ!

Cú pháp Trait trong Scala

Cú pháp cho trait trong Scala khá đơn giản, được định nghĩa bằng từ khóa trait theo sau là tên của trait.

trait Trait_Name{
// Variables
// Methods
}
scala trait syntax


Như bạn thấy từ định nghĩa trait ở trên, một trait tên DataCamp đã được định nghĩa, bên trong chưa có biến hay phương thức nào.

Hãy chuyển sang một ví dụ đơn giản về trait trong Scala để bạn hiểu rõ hơn cách chúng hoạt động ở mức lập trình.

Như đã thảo luận trong phần giới thiệu, các Trait trong Scala được một lớp kế thừa bằng từ khóa extends.

class Scala_Tutorial extends DataCamp{
// Variables
// Methods
}

Hãy định nghĩa một trait tên Scala_Course, sẽ được lớp DataCamp kế thừa. Bên trong trait, bạn sẽ định nghĩa một phương thức trừu tượng tên scala(), sẽ được định nghĩa trong lớp DataCamp.

trait Scala_Course{  
    def scala()  
}  

class DataCamp extends Scala_Course{  
    def scala(){  
        println("DataCamp has recently launched there first Scala course")  
    }  
}  

object Main{  
    def main(args:Array[String]){  
        var a = new DataCamp()  
        a.scala()  
    }  
}

Bây giờ hãy chạy đoạn mã trên.

example


Trong ví dụ trên, phương thức scala() là phương thức trừu tượng, do đó phần khai báo được thực hiện trong lớp kế thừa trait đó.

Nhưng nếu bạn có một phương thức (không trừu tượng) đã được triển khai trong trait thì sao? Trong trường hợp đó, lớp mở rộng trait này không cần triển khai lại phương thức đã được triển khai trong trait.

Hãy hiểu điều này bằng một ví dụ nhỏ.

trait BMW{

    // trait variables
    var make: String = "BMW"
    var model: String = "X7"
    var fuel: Int = 40

    // trait method: NON-ABSTRACT
    def Display()
    {
        println("Make of the Car : " + make);
        println("Model of the Car : " + model);
        println("Fuel capacity of the Car : " + fuel);
    }
}


class Car extends BMW{
    // class variables
    var make1: String = "Mercedes Benz"
    var model1: String = "S350D"
    var fuel1: Int = 50

    // Class method
    def Merc_Specs()
    {
        println("Make of the Car : " + make1);
        println("Model of the Car : " + model1);
        println("Fuel capacity of the Car : " + fuel1);
    }
}

object Main  
{

    // Main method
    def main(args: Array[String])  
    {

        // Class object
        var obj = new Car();
        println("Calling the Class Method")
        obj.Merc_Specs();
        println("Calling the Trait Method")
        obj.Display();
    }
}

Hãy chạy đoạn mã trên:

example


Giờ bạn đã hiểu sự khác biệt giữa phương thức trừu tượng và không trừu tượng, hãy xem điều gì có thể xảy ra khi một phương thức trừu tượng không được triển khai trong lớp kế thừa hoặc mở rộng nó.

Hãy dùng lại ví dụ trước để hiểu khái niệm này.

trait Scala_Course{  
    def scala()  
}  

class DataCamp extends Scala_Course{  
    def print(){  
        println("Error: Class DataCamp needs to be Abstract")  
    }  
}  

object Main{  
    def main(args:Array[String]){  
        var a = new DataCamp()  
        a.print()  
    }  
}

Chạy đoạn mã trên sẽ dẫn đến lỗi như dưới đây, vì bạn đã không định nghĩa phương thức trait scala() (trừu tượng) trong lớp kế thừa nó.

example

Để đoạn mã trên chạy được, có hai cách khả dĩ:

  • Định nghĩa phương thức scala() trong lớp DataCamp hoặc
  • Định nghĩa lớp DataCamp là abstract.

Chủ đề cuối cùng của bài hôm nay là cách bạn có thể kế thừa nhiều trait trong một lớp. Hãy nhanh chóng hoàn tất phần này.

trait A{
// methods
}
trait B{
// methods
}
class C extends A with B{
}
trait BMW{


    var make: String = "BMW"
    var model: String = "X7"
    var fuel: Int = 40
}

trait Merc{


    var make1: String = "Mercedes Benz"
    var model1: String = "S350D"
    var fuel1: Int = 50


}



class Car extends BMW with Merc{

    def BMW_Specs()
    {
        println("Make of the Car : " + make);
        println("Model of the Car : " + model);
        println("Fuel capacity of the Car : " + fuel);
    }


    def Merc_Specs()
    {
        println("Make of the Car : " + make1);
        println("Model of the Car : " + model1);
        println("Fuel capacity of the Car : " + fuel1);
    }

}


object Main  
{

    // Main method
    def main(args: Array[String])  
    {

        // Class object
        var obj = new Car();
        println("Calling the BMW Trait")
        obj.BMW_Specs();
        println();
        println("Calling the Merc Trait")
        obj.Merc_Specs();
    }
}

Cuối cùng, hãy chạy đoạn mã trên.

example

Chúc mừng!

Chúc mừng bạn đã hoàn thành bài hướng dẫn này.

Giờ bạn đã biết Trait trong lập trình là gì và cách sử dụng chúng trong Scala. Một bài tập hay cho bạn là tìm lời giải khi phương thức trừu tượng không được định nghĩa trong lớp kế thừa nó. Hãy thử viết mã cho tình huống đó và xem mã có chạy mà không gặp lỗi biên dịch không. Gợi ý nhỏ: bạn có thể tìm hiểu về Abstract Class trong Scala.

Vui lòng đặt câu hỏi liên quan đến bài hướng dẫn này trong phần bình luận bên dưới.

Cuối cùng, đừng quên tham gia khóa học Scala mới trên DataCamp, Giới thiệu về Scala.

Chủ đề
Scala

Khóa học Scala

Khóa học

Introduction to Scala

3 giờ
27.2K
Begin your journey with Scala, a popular language for scalable applications and data engineering infrastructure.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm