最终 OOP 检查
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 70 课,共 70 课。
挑战
简单让我们一起运用你学过的 Lua 面向对象编程知识!你将构建一个车辆系统,展示继承、通过命名约定实现的封装,以及用于添加可选功能的混入。
你将把代码组织在 5 个文件中:
Vehicle.lua:所有车辆的基类。每辆车都有一个name和一个遵循私有约定的_speed(初始值为 0)。添加一个:getName()读取方法、一个:getSpeed()读取方法,以及一个:setSpeed(value)设置方法,用于拒绝负值(如果值为负数,则打印Speed cannot be negative,且不更改该值)。添加一个:describe()方法,返回"{name} moving at {speed}"。Refuelable.lua:包含燃油相关行为的混入表。添加一个:refuel(amount)方法,用于增加self._fuel的值;再添加一个:getFuel()方法,返回当前燃油量。Car.lua:继承自 Vehicle 并使用 Refuelable 混入。构造函数接受一个name,并将_fuel初始化为 0。重写:describe(),使其返回"{name} moving at {speed}, fuel: {fuel}"。将 Refuelable 混入应用到 Car,为汽车添加燃油相关功能。Bicycle.lua:只继承自 Vehicle,不需要燃油功能。构造函数只接受一个name。自行车直接使用继承而来的:describe()方法,不做修改。main.lua:把所有内容组合起来!根据输入创建一辆汽车和一辆自行车,展示它们各自的功能,并说明它们如何共享车辆的通用行为,同时又各有不同的特点。
你将收到 4 个输入:
- 汽车名称
- 自行车名称
- 要为两辆车设置的速度(一个数字)
- 要添加到汽车中的燃油量(一个数字)
在主文件中:
- 使用给定的名称创建一辆汽车和一辆自行车
- 使用第三个输入为两辆车设置速度
- 使用第四个输入为汽车添加燃油
- 打印汽车的描述
- 打印自行车的描述
例如,如果输入是 Sedan、Mountain Bike、60 和 45,输出应为:
Sedan moving at 60, fuel: 45
Mountain Bike moving at 60如果输入是 Sports Car、Road Bike、120 和 80,输出应为:
Sports Car moving at 120, fuel: 80
Road Bike moving at 120这个挑战展示了继承如何提供共享行为(两种车辆都可以移动)、混入如何添加可选功能(只有汽车需要燃油),以及封装如何保护数据完整性(验证速度)。在你的设计中,每种技术都有不同的用途!
亲手试试
-- main.lua:将所有部分组合起来
local Car = require('Car')
local Bicycle = require('Bicycle')
-- 读取输入
local carName = io.read()
local bicycleName = io.read()
local speed = tonumber(io.read())
local fuelAmount = tonumber(io.read())
-- TODO:用给定的名称创建一辆汽车
-- TODO:用给定的名称创建一辆自行车
-- TODO:设置两辆车的速度
-- TODO:按给定的燃油量给汽车加油
-- TODO:打印汽车的描述
-- TODO:打印自行车的描述
面向对象编程中的所有课
自己练习: Lua 在线编译器