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