图形集合
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 59 课,共 70 课。
挑战
简单现在,你已经创建了功能齐全的 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 在线编译器