Phương thức getter
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 13 trên 70.
Bạn đã học cách lưu trữ dữ liệu trong các biến thực thể như self.health hoặc self.items. Bạn có thể truy cập trực tiếp các trường này từ bên ngoài đối tượng, nhưng có một cách gọn gàng hơn: dùng phương thức getter.
Hàm lấy (còn gọi là phương thức truy cập) là một phương thức đơn giản trả về giá trị nội bộ. Thay vì truy cập trực tiếp vào player.health, bạn gọi player:getHealth():
local Player = {}
Player.__index = Player
function Player:new(name)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.health = 100
return instance
end
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endTại sao cần thêm một phương thức? Các phương thức getter cung cấp một điểm truy cập có kiểm soát vào dữ liệu của bạn.
Hiện tại, :getHealth() chỉ trả về giá trị. Nhưng sau này, bạn có thể muốn thêm logic, chẳng hạn trả về "Critical" nếu sức khỏe giảm xuống dưới 10, hoặc ghi nhật ký mỗi lần kiểm tra sức khỏe.
Khi đã có getter, bạn có thể thực hiện những thay đổi này mà không cần sửa bất kỳ code nào đang sử dụng đối tượng.
local hero = Player:new("Luna")
print(hero:getHealth()) -- Đầu ra: 100
print(hero:getName()) -- Đầu ra: LunaMẫu này tạo ra ranh giới rõ ràng giữa cấu trúc bên trong của một đối tượng và cách code khác tương tác với nó. Bên ngoài lấy dữ liệu thông qua các phương thức thay vì truy cập trực tiếp vào các trường của đối tượng.
Thử thách
DễHãy xây dựng một lớp Player sử dụng các phương thức getter để truy cập dữ liệu nội bộ. Thay vì truy cập trực tiếp vào các trường của người chơi, bạn sẽ tạo các phương thức để kiểm soát việc truy cập thông tin của người chơi.
Bạn sẽ sắp xếp code trong hai tệp:
Player.lua: Định nghĩa lớpPlayertheo mẫu prototype tiêu chuẩn. Hàm khởi tạo nhận một tên và khởi tạo máu bằng100. Thêm ba phương thức getter::getName()trả về tên người chơi:getHealth()trả về lượng máu hiện tại của người chơi:getStatus()trả về một chuỗi được định dạng, kết hợp cả hai thông tin
main.lua: Nạp module Player và tạo một instance người chơi. Dùng các phương thức getter để hiển thị thông tin của người chơi: truy cập mọi thứ thông qua các phương thức thay vì đọc trực tiếp các trường.
Phương thức :getStatus() của bạn cần trả về một chuỗi theo đúng định dạng sau:
[name] has [health] HPBạn sẽ nhận một đầu vào: tên người chơi.
Trong tệp chính, hãy tạo một người chơi với tên đã cho, sau đó in ba dòng bằng các phương thức getter:
- Tên người chơi (dùng
:getName()) - Lượng máu của người chơi (dùng
:getHealth()) - Trạng thái đầy đủ của người chơi (dùng
:getStatus())
Ví dụ, nếu đầu vào là Luna, đầu ra sẽ là:
Luna
100
Luna has 100 HPTự làm thử
-- Nạp module Player bằng require
local Player = require('Player')
-- Đọc đầu vào
local name = io.read()
-- TODO: Tạo instance của người chơi với tên đã cho
-- TODO: In ra tên người chơi bằng :getName()
-- TODO: In ra lượng máu của người chơi bằng :getHealth()
-- TODO: In ra trạng thái của người chơi bằng :getStatus()
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