Menu
CoddyTech

Hàm khởi tạo :new()

Thuộc phần Lập trình hướng đối tượng trong hành trình Lua của Coddy. Bài học 8 trên 70.

Tạo đối tượng thủ công, tạo bảng rỗng, đặt metatable cho bảng rồi liên kết __index sẽ khiến bạn phải lặp lại nhiều thao tác. Cách giải quyết tiêu chuẩn là định nghĩa phương thức hàm khởi tạo :new() ngay trong lớp để phương thức này xử lý tất cả thay bạn.

Đây là mẫu:

local Dog = {}
Dog.__index = Dog

function Dog:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function Dog:bark()
    print("Woof!")
end

Hãy cùng phân tích những gì diễn ra bên trong :new(). Đầu tiên, chúng ta tạo một bảng trống có tên là instance. Sau đó, chúng ta đặt metatable của bảng này thành self, tức là Dog khi chúng ta gọi Dog:new().

Vì Dog.__index trỏ đến chính Dog, đối tượng có thể tìm thấy tất cả phương thức được định nghĩa trong Dog. Cuối cùng, ta trả về đối tượng mới.

Hãy chú ý dòng Dog.__index = Dog nằm bên ngoài hàm khởi tạo (constructor). Đây là cách viết tắt phổ biến. Thay vì tạo một metatable riêng, bảng lớp vừa đóng vai trò là nguyên mẫu, vừa là metatable.

Giờ đây, việc tạo đối tượng thật gọn gàng và nhất quán:

local myDog = Dog:new()
myDog:bark()  -- Đầu ra: Woof!

Mọi lớp bạn tạo đều tuân theo cùng một cấu trúc. Hàm khởi tạo :new() trở thành nơi duy nhất tạo đối tượng, giúp code của bạn có tổ chức và dễ dự đoán.

challenge icon

Thử thách

Dễ

Hãy tạo một lớp (class) Cat bằng cách dùng mẫu hàm khởi tạo tiêu chuẩn bạn vừa học. Bạn sẽ sắp xếp code trong hai tệp để thực hành cấu trúc module phù hợp.

Bạn sẽ tạo:

  • Cat.lua: Định nghĩa lớp Cat với mẫu hàm khởi tạo hoàn chỉnh. Lớp của bạn cần có:
    • Bảng lớp có __index trỏ đến chính nó
    • Hàm khởi tạo (constructor) :new() tạo một instance, đặt metatable cho instance đó và trả về instance
    • Phương thức (method) :meow() in ra tiếng kêu của mèo
    Trả về bảng lớp ở cuối tệp.
  • main.lua: Dùng lệnh require để nạp module Cat và dùng hàm khởi tạo để tạo một instance mèo. Sau đó gọi phương thức của instance để xác nhận mọi thứ đã liên kết chính xác.

Bạn sẽ nhận một đầu vào: số lần mèo cần kêu.

Phương thức :meow() cần in ra chính xác:

Meow!

Trong tệp chính, hãy tạo một con mèo bằng Cat:new() và gọi :meow() theo số lần đã cho.

Ví dụ, nếu đầu vào là 3, đầu ra sẽ là:

Meow!
Meow!
Meow!

Tự làm thử

-- Nạp module Cat
local Cat = require('Cat')

-- Đọc đầu vào: số lần kêu meo
local times = tonumber(io.read())

-- TODO: Tạo một instance mèo bằng Cat:new()

-- TODO: Gọi phương thức (method) :meow() theo số lần đã chỉ định
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Lua online