Ôn tập: Lắp ráp robot
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 54 trên 70.
Thử thách
DễHãy lắp ráp một Robot từ các bộ phận riêng lẻ! Thay vì dùng kế thừa, bạn sẽ xây dựng robot bằng cách kết hợp các đối tượng Arm, Leg và Head riêng biệt, mỗi đối tượng có hành vi chuyên biệt của riêng mình. Robot sẽ điều phối các bộ phận này thông qua việc ủy quyền.
Bạn sẽ sắp xếp code trong năm tệp:
Arm.lua: Tạo lớp Arm với hàm khởi tạo:new(side)để lưu bên mà cánh tay thuộc về (ví dụ: "left" hoặc "right"). Thêm phương thức:raise()để in ra{side} arm raisedvà phương thức:lower()để in ra{side} arm lowered.Leg.lua: Tạo lớp Leg với hàm khởi tạo:new(side)để lưu bên. Thêm phương thức:step()để in ra{side} leg steps forward.Head.lua: Tạo lớp Head với hàm khởi tạo:new(). Thêm phương thức:nod()để in raHead nodsvà phương thức:shake()để in raHead shakes.Robot.lua: Tạo lớp Robot có hàm khởi tạo:new(name)để lưu tên và tự tạo tất cả bộ phận bên trong: một cánh tay trái, một cánh tay phải, một chân trái, một chân phải và một cái đầu. Robot cần có các phương thức sau để ủy quyền cho các bộ phận::greet(): in ra{name} says hello!, sau đó giơ cánh tay phải lên rồi hạ xuống:walk(): bước chân trái trước, sau đó bước chân phải:respond(answer): nếu câu trả lời là"yes", đầu gật; nếu là"no", đầu lắc
main.lua: Đọc đầu vào gồm tên robot và câu trả lời yes/no. Tạo một Robot, cho robot chào, đi bộ rồi phản hồi dựa trên đầu vào.
Bạn sẽ nhận hai đầu vào:
- Tên robot (một chuỗi)
- Một câu trả lời:
yeshoặcno
Đầu ra cần thể hiện robot điều phối các bộ phận của mình:
{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nodsHoặc nếu câu trả lời là no:
{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head shakesVí dụ, nếu đầu vào là Robo và yes, đầu ra sẽ là:
Robo says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nodsLưu ý rằng Robot không biết cánh tay giơ lên hay chân bước đi như thế nào. Nó chỉ đơn giản yêu cầu mỗi bộ phận thực hiện việc cần làm. Mỗi bộ phận hoạt động độc lập và có thể tái sử dụng, còn robot đóng vai trò điều phối để kết hợp tất cả lại!
Tự làm thử
-- main.lua: Điểm bắt đầu của thử thách ghép thành phần Robot
local Robot = require('Robot')
-- Đọc các giá trị đầu vào
local name = io.read()
local answer = io.read()
-- TODO: Tạo một Robot với tên đã cho
-- TODO: Cho robot chào hỏi
-- TODO: Cho robot đi bộ
-- TODO: Cho robot phản hồi dựa trên câu trả lời đầu vào
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ạng9Kết hợp và mixin
Quan hệ có-mộtỦy quyềnMixin đơn giảnÁp dụng nhiều mixinMixin và kế thừaÔn tập: Lắp ráp robotTự luyện tập: Trình biên dịch Lua online