Menu
CoddyTech

总面积

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

challenge icon

挑战

简单

让我们为你的 ShapeCollection 添加一个强大的功能:计算其中所有形状的总面积。多态的优势在这里体现得淋漓尽致:你的集合可以对任意形状调用 :getArea(),而不必知道它是矩形还是圆形。

你将继续使用现有的项目文件:

  • Shape.lua:你的 Shape 基类(保持不变)。
  • Rectangle.lua:你的 Rectangle 类,包含 :getArea() 和 :getPerimeter()。
  • Circle.lua:你的 Circle 类,包含 :getArea() 和 :getPerimeter()。
  • ShapeCollection.lua:通过添加 :getTotalArea() 方法来扩展你的集合类。这个方法应遍历所有已存储的形状,对每个形状调用 :getArea(),并返回所有面积的总和。
  • main.lua:导入你的模块,从输入中读取尺寸,创建一个 Rectangle 和一个 Circle,将它们都添加到一个 ShapeCollection 中,然后输出集合中所有形状的总面积。

这种做法的妙处在于,:getTotalArea() 不需要为矩形和圆形分别编写逻辑。它只需相信集合中的每个形状都有一个 :getArea() 方法。之后你可以添加三角形、六边形或其他任何形状,总面积的计算都无需修改。

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

输出:一行,包含集合中所有形状的总面积。

亲手试试

-- 加载 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:getTotalArea())

面向对象编程中的所有课

自己练习: Lua 在线编译器