Menu
CoddyTech

最终 OOP 检查

本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 70 课,共 70 课。

challenge icon

挑战

简单

让我们一起运用你学过的 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 个输入:

  1. 汽车名称
  2. 自行车名称
  3. 要为两辆车设置的速度(一个数字)
  4. 要添加到汽车中的燃油量(一个数字)

在主文件中:

  1. 使用给定的名称创建一辆汽车和一辆自行车
  2. 使用第三个输入为两辆车设置速度
  3. 使用第四个输入为汽车添加燃油
  4. 打印汽车的描述
  5. 打印自行车的描述

例如,如果输入是 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 在线编译器