回顾:机器人组装
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 54 课,共 70 课。
挑战
简单让我们用单独的组件组装一个 Robot!你不会使用继承,而是通过组合单独的 Arm、Leg 和 Head 对象来构建机器人,每个对象都有自己的专属行为。机器人会通过委托来协调这些组件。
你需要将代码分成 5 个文件:
Arm.lua:创建一个 Arm 类,并添加构造函数:new(side),用于存储手臂所在的一侧(例如,"left" 或 "right")。添加一个:raise()方法,输出{side} arm raised,再添加一个:lower()方法,输出{side} arm lowered。Leg.lua:创建一个 Leg 类,并添加构造函数:new(side),用于存储腿所在的一侧。添加一个:step()方法,输出{side} leg steps forward。Head.lua:创建一个 Head 类,并添加构造函数:new()。添加一个:nod()方法,输出Head nods,再添加一个:shake()方法,输出Head shakes。Robot.lua:创建一个 Robot 类,其构造函数:new(name)用于存储名称,并在内部创建所有组件:左臂、右臂、左腿、右腿和头部。Robot 应包含以下方法,这些方法会委托相应组件执行操作::greet():输出{name} says hello!,然后抬起右臂,再放下右臂:walk():先让左腿迈步,再让右腿迈步:respond(answer):如果 answer 是"yes",头部就点头;如果是"no",头部就摇头
main.lua:读取机器人的名称和一个是/否回应作为输入。创建一个 Robot,让它打招呼、行走,然后根据输入作出回应。
你会收到两个输入:
- 机器人的名称(一个字符串)
- 一个回应:
yes或no
输出应显示机器人如何协调各个组件:
{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nods如果回应是 no,输出如下:
{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head shakes例如,如果输入是 Robo 和 yes,输出应为:
Robo says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nods注意,Robot 并不知道手臂是如何抬起的,也不知道腿是如何迈步的。它只需告诉每个组件要做什么。每个组件都是独立且可复用的,而机器人则负责协调,将它们组合在一起!
亲手试试
-- main.lua:Robot 组合挑战的入口
local Robot = require('Robot')
-- 读取输入
local name = io.read()
local answer = io.read()
-- TODO:用给定的名字创建一个 Robot
-- TODO:让机器人打招呼
-- TODO:让机器人行走
-- TODO:让机器人根据输入的答案作出回应
面向对象编程中的所有课
自己练习: Lua 在线编译器