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.
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
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ền7Đa hình và ghi đè
Ghi đè phương thứcGọi phương thức của lớp chaGõ kiểu vịtGiao diện chungKiểm tra kiểuÔn tập: Vai trò của nhân viên10Dự án: Quản lý hình dạng
Thiết lập dự ánLớp hình chữ nhậtLớp hình trònPhương thức tính chu viTập hợp hình dạngTổng diện tíchLọc hình dạng2Mẫ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