Ôn tập: hệ phân cấ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 36 trên 70.
Thử thách
DễHãy tạo một hệ thống phân cấp hình dạng hoàn chỉnh từ đầu! Bạn sẽ tạo lớp cha Shape để mọi hình dạng kế thừa, sau đó tạo các lớp con Circle và Square. Mỗi lớp có thuộc tính riêng, đồng thời dùng chung các chức năng.
Bạn sẽ sắp xếp code trong bốn tệp:
Shape.lua: Lớp cơ sở mà mọi hình dạng sẽ kế thừa. Lớp này cần có hàm khởi tạo:new(color)để lưu màu của hình dạng và phương thức:getColor()để trả về màu đó. Nhờ có thuộc tính dùng chung này, mọi hình dạng, dù là hình tròn hay hình vuông, đều có màu.Circle.lua: Lớp con kế thừa từ Shape. Hàm khởi tạo:new(color, radius)cần gọi hàm khởi tạo của lớp cha để lưu màu, sau đó thêm bán kính làm thuộc tính riêng. Thêm phương thức:describe()để in thông tin của hình tròn.Square.lua: Một lớp con khác kế thừa từ Shape. Hàm khởi tạo:new(color, side)cũng cần gọi hàm khởi tạo của lớp cha, sau đó lưu độ dài cạnh. Thêm phương thức:describe()cho hình vuông.main.lua: Kết hợp mọi thứ bằng cách tạo instance của cả hai hình dạng và cho thấy chúng kế thừa đúng cách từ Shape, đồng thời vẫn giữ các thuộc tính riêng.
Bạn sẽ nhận hai đầu vào:
- Dữ liệu hình tròn: màu sắc và bán kính, cách nhau bằng dấu phẩy (ví dụ:
blue,5) - Dữ liệu hình vuông: màu sắc và độ dài cạnh, cách nhau bằng dấu phẩy (ví dụ:
red,4)
Trong tệp chính, hãy tạo một Circle và một Square với các giá trị đã cho. Sau đó, in các nội dung sau, mỗi nội dung trên một dòng riêng:
- Gọi
:describe()trên hình tròn - Gọi
:describe()trên hình vuông - In màu của hình tròn bằng
:getColor() - In màu của hình vuông bằng
:getColor()
Phương thức :describe() của Circle cần in:
Circle with radius {radius}Phương thức :describe() của Square cần in:
Square with side {side}Ví dụ, nếu đầu vào là blue,5 và red,4, đầu ra sẽ là:
Circle with radius 5
Square with side 4
blue
redĐây là ví dụ đầy đủ về kế thừa: cả hai hình dạng đều kế thừa :getColor() từ Shape (chúng không tự định nghĩa phương thức này), trong khi mỗi hình có thuộc tính riêng và phương thức :describe()!
Tự làm thử
-- main.lua: Kết hợp mọi thứ
local Circle = require('Circle')
local Square = require('Square')
-- Đọc đầu vào cho hình tròn (color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)
-- Đọc đầu vào cho hình vuông (color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)
-- TODO: Tạo một instance Circle với màu sắc và bán kính đã cho
-- TODO: Tạo một instance Square với màu sắc và độ dài cạnh đã cho
-- TODO: Gọi :describe() trên hình tròn
-- TODO: Gọi :describe() trên hình vuông
-- TODO: In ra màu sắc của hình tròn bằng :getColor()
-- TODO: In ra màu sắc của hình vuông bằng :getColor()
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ền2Mẫ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