Menu
CoddyTech

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)
end

Hà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 Poodle

Cả 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.

challenge icon

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ớp Person vớ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 old

Bạn sẽ nhận hai đầu vào:

  1. Tên của người đó
  2. 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 old

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