Menu
CoddyTech

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
end

Tạ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: Luna

Mẫ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.

challenge icon

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ớp Player theo 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ằng 100. 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] HP

Bạ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:

  1. Tên người chơi (dùng :getName())
  2. Lượng máu của người chơi (dùng :getHealth())
  3. 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 HP

Tự 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()
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