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!")
endHã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.
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ớpCatvớ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ó
__indextrỏ đế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
- Bảng lớp có
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
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
1Khái niệm “self”
Bảng với hàm“self” tường minhCú pháp dấu hai chấmDấu chấm và dấu hai chấmÔn tập: Điểm chuyển động4Dự án: Ngân hàng số
Thiết lập dự ánPhương thức nạp tiền2Mẫu Prototype cho lớp
Khái niệm PrototypeLiên kết bằng __indexHàm khởi tạo :new()Khởi tạo thuộc tínhCác instance độc lậpÔn tập: Nhà máy ô tô5Nạp chồng toán tử trong OOP
Cộng các đối tượngTrừ các đối tượngNối các đối tượngSo sánh các đối tượng (<, >)Ôn tập: phép tính với ví tiền8Đóng gói
Quy ước đặt tênClosure để bảo mậtTruy cập qua closureBảng chỉ đọcLogic kiểm tra hợp lệTổng kết: Két an toàn11Mẫu thiết kế (cơ bản)
Hàm tạo đối tượngBảng SingletonMẫu IteratorObserver (Listener)Ôn tập: Factory Logger3Trạng thái và hành vi của đối tượng
Biến instancePhương thức getterPhương thức setterThuộc tính tính toánĐịnh dạng chuỗiKiểm tra tính bằng nhauÔn tập: điểm số học sinh6Cơ bản về kế thừa
Thiết lập kế thừaKế thừa phương thứcMở rộng hàm khởi tạoThêm phương thức cho lớp conDùng chung và riêngÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch Lua online