Menu
CoddyTech

图形集合

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

challenge icon

挑战

简单

现在,你已经创建了功能齐全的 Rectangle 和 Circle 类,接下来让我们创建一个 ShapeCollection 类,用来统一管理多个形状。这是组合的一个很好的例子:这个集合“拥有”形状,而不是“本身就是”一个形状。

你会在不断扩展的项目中添加一个新文件:

  • Shape.lua:基础 Shape 类(保持不变)。
  • Rectangle.lua:包含 :getArea() 和 :getPerimeter() 的 Rectangle 类。
  • Circle.lua:包含 :getArea() 和 :getPerimeter() 的 Circle 类。
  • ShapeCollection.lua:创建一个用于在内部存储形状的新类。添加一个 :new() 构造函数,用于初始化一个空的形状列表;添加一个 :addShape(shape) 方法,用于将任意形状添加到集合中;再添加一个 :count() 方法,用于返回当前存储的形状数量。
  • main.lua:通过引入你的模块,将所有内容整合起来。从输入中读取尺寸,创建一个 Rectangle 和一个 Circle,将两者都添加到 ShapeCollection 中,然后打印集合中的形状数量,以及每个形状的名称(按添加顺序)。

ShapeCollection 不需要知道自己存储的是矩形还是圆形,它只需存放形状。这展示了多态如何让你通过通用接口,以统一的方式处理不同类型的对象。

输入:三行:宽度(数字)、高度(数字)和半径(数字)。

输出:三行:集合中的形状数量、首先添加的形状名称,然后是第二个添加的形状名称。

亲手试试

-- 加载 Rectangle 模块
local Rectangle = require('Rectangle')

-- 加载 Circle 模块
local Circle = require('Circle')

-- 加载 ShapeCollection 模块
local ShapeCollection = require('ShapeCollection')

-- 从输入中读取宽度和高度
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- 用给定的尺寸创建一个新的 Rectangle 实例
local rect = Rectangle:new(width, height)

-- 用给定的半径创建一个新的 Circle 实例
local circ = Circle:new(radius)

-- 创建一个新的 ShapeCollection
local collection = ShapeCollection:new()

-- 将两个形状都添加到集合中
collection:addShape(rect)
collection:addShape(circ)

-- 输出集合中的形状数量
print(collection:count())

-- 按添加顺序输出每个形状的名称
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

面向对象编程中的所有课

自己练习: Lua 在线编译器