Menu
CoddyTech

Tổng diện tích

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

challenge icon

Thử thách

Dễ

Hãy thêm một tính năng mạnh mẽ vào ShapeCollection: khả năng tính tổng diện tích của tất cả các hình mà nó chứa. Đây là lúc tính đa hình phát huy tác dụng: bộ sưu tập có thể gọi :getArea() trên bất kỳ hình nào mà không cần biết đó là hình chữ nhật hay hình tròn.

Bạn sẽ tiếp tục xây dựng dựa trên các tệp hiện có của dự án:

  • Shape.lua: lớp Shape cơ sở của bạn (không thay đổi).
  • Rectangle.lua: lớp Rectangle có :getArea() và :getPerimeter().
  • Circle.lua: lớp Circle có :getArea() và :getPerimeter().
  • ShapeCollection.lua: Mở rộng lớp bộ sưu tập bằng cách thêm phương thức :getTotalArea(). Phương thức này sẽ lặp qua tất cả hình đã lưu, gọi :getArea() trên từng hình và trả về tổng diện tích.
  • main.lua: Nạp các module, đọc kích thước từ đầu vào, tạo một Rectangle và một Circle, thêm cả hai vào ShapeCollection, sau đó in ra tổng diện tích của tất cả hình trong bộ sưu tập.

Điểm hay của cách tiếp cận này là :getTotalArea() không cần logic riêng cho hình chữ nhật và hình tròn. Phương thức này chỉ cần tin rằng mỗi hình trong bộ sưu tập đều có phương thức :getArea(). Sau này, bạn có thể thêm hình tam giác, hình lục giác hoặc bất kỳ hình nào khác, và phép tính tổng diện tích vẫn hoạt động mà không cần chỉnh sửa.

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

Đầu ra: Một dòng chứa tổng diện tích của tất cả hình trong bộ sưu tập.

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 tập hợp
collection:addShape(rect)
collection:addShape(circ)

-- In ra tổng diện tích của tất cả các hình trong tập hợp
print(collection:getTotalArea())

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