Menu
CoddyTech

Tập hợp hình dạng

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 59 trên 70.

challenge icon

Thử thách

Dễ

Giờ đây, khi đã có lớp Rectangle và Circle với đầy đủ chức năng, hãy tạo lớp ShapeCollection để quản lý nhiều hình dạng cùng lúc. Đây là một ví dụ hay về tính kết hợp (composition): bộ sưu tập “có” các hình dạng thay vì “là” một hình dạng.

Bạn sẽ thêm một tệp mới vào dự án đang phát triển:

  • Shape.lua: Lớp Shape cơ sở của bạn, không thay đổi.
  • Rectangle.lua: Lớp Rectangle của bạn với :getArea() và :getPerimeter().
  • Circle.lua: Lớp Circle của bạn với :getArea() và :getPerimeter().
  • ShapeCollection.lua: Tạo một lớp mới lưu trữ các hình dạng bên trong. Thêm hàm khởi tạo :new() để khởi tạo một danh sách hình dạng trống, phương thức :addShape(shape) để thêm bất kỳ hình dạng nào vào bộ sưu tập, và phương thức :count() để trả về số hình dạng hiện đang được lưu trữ.
  • main.lua: Kết hợp mọi thứ bằng cách nạp các module của bạn. Đọc kích thước từ đầu vào, tạo một Rectangle và một Circle, thêm cả hai vào một ShapeCollection, rồi in ra số hình dạng trong bộ sưu tập, tiếp theo là tên của từng hình dạng theo thứ tự chúng được thêm vào.

ShapeCollection không cần biết nó đang lưu trữ hình chữ nhật hay hình tròn. Nó chỉ chứa các hình dạng. Điều này cho thấy tính đa hình (polymorphism) cho phép bạn xử lý đồng nhất các kiểu đối tượng khác nhau thông qua một giao diện chung.

Đầu vào: Ba dòng: chiều rộng (số), chiều cao (số) và bán kính (số).

Đầu ra: Ba dòng: số hình dạng trong bộ sưu tập, tên của hình dạng được thêm đầu tiên, rồi tên của hình dạng được thêm thứ hai.

Tự làm thử

-- Nạp module Rectangle
local Rectangle = require('Rectangle')

-- Nạp module Circle
local Circle = require('Circle')

-- Nạp module ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- Đọc chiều rộng và chiều cao từ đầu vào
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- Tạo instance Rectangle mới với kích thước đã cho
local rect = Rectangle:new(width, height)

-- Tạo instance Circle mới với bán kính đã cho
local circ = Circle:new(radius)

-- Tạo ShapeCollection mới
local collection = ShapeCollection:new()

-- Thêm cả hai hình vào bộ sưu tập
collection:addShape(rect)
collection:addShape(circ)

-- In ra số lượng hình trong bộ sưu tập
print(collection:count())

-- In ra tên của từng hình theo thứ tự thêm vào
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

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