Khởi tạo thuộc tính
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 9 trên 70.
Hàm khởi tạo :new() mà bạn đã học tạo ra các đối tượng, nhưng mọi thực thể đều bắt đầu giống hệt nhau. Đối tượng thực tế cần có dữ liệu riêng: mỗi người có một tên cụ thể, mỗi người chơi có một điểm số ban đầu. Để đối tượng trở nên hữu ích, hàm khởi tạo phải nhận các đối số và gán chúng cho thực thể mới.
Sau đây là cách mở rộng hàm khởi tạo để nhận các giá trị ban đầu:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endHàm khởi tạo giờ nhận name và breed làm tham số. Sau khi tạo đối tượng rỗng và thiết lập siêu bảng của nó, ta gán trực tiếp các giá trị này vào các trường của đối tượng. Mỗi đối tượng được tạo sẽ có name và breed riêng.
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Đầu ra: I am Rex, a German Shepherd
dog2:introduce() -- Đầu ra: I am Bella, a PoodleCả hai chú chó cùng dùng phương thức :introduce() từ nguyên mẫu, nhưng mỗi chú có tên và giống riêng được lưu trong bảng đối tượng. Đây là ưu điểm của việc kết hợp nguyên mẫu với hàm khởi tạo có tham số: hành vi dùng chung nhưng trạng thái riêng.
Thử thách
DễHãy tạo một lớp Person để tạo ra những cá nhân riêng biệt với tên và tuổi của riêng họ. Bạn sẽ sắp xếp code trong hai tệp để thực hành cấu trúc module đúng cách.
Bạn sẽ tạo:
Person.lua: Định nghĩa lớpPersonvới hàm khởi tạo nhận tên và tuổi. Thêm phương thức:introduce()để mỗi người có thể tự giới thiệu.main.lua: Nạp module Person và tạo một instance của người đó bằng các đầu vào đã cho. Sau đó, gọi họ tự giới thiệu.
Hàm khởi tạo :new(name, age) cần nhận cả hai giá trị và lưu chúng vào instance mới. Phương thức :introduce() cần in ra theo đúng định dạng sau:
Hello, my name is [name] and I am [age] years oldBạn sẽ nhận hai đầu vào:
- Tên của người đó
- Tuổi của người đó
Ví dụ, nếu đầu vào là Alice và 25, đầu ra sẽ là:
Hello, my name is Alice and I am 25 years oldTự làm thử
-- Nạp module Person bằng require
local Person = require('Person')
-- Đọc đầu vào
local name = io.read()
local age = io.read()
-- TODO: Tạo một instance Person mới bằng Person:new(name, age)
-- TODO: Gọi phương thức (method) introduce() trên instance Person vừa tạo
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