Menu
CoddyTech

回顾:形状层级结构

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

challenge icon

挑战

简单

让我们从头开始构建一个完整的形状继承体系!你将创建一个 Shape 父类,所有形状都继承自它,然后创建 Circle 和 Square 子类。它们各自拥有独特的属性,同时共享通用功能。

你将把代码分成四个文件:

  • Shape.lua:所有形状都会继承的基类。它应该有一个 :new(color) 构造函数,用于存储形状的颜色,还有一个返回颜色的 :getColor() 方法。这个共享属性意味着每个形状,无论是圆形还是正方形,都有颜色。
  • Circle.lua:一个继承自 Shape 的子类。它的 :new(color, radius) 构造函数应该调用父类构造函数来处理颜色,然后添加半径作为独有属性。添加一个 :describe() 方法,用来打印圆形的详细信息。
  • Square.lua:另一个继承自 Shape 的子类。它的 :new(color, side) 构造函数也应该调用父类构造函数,然后存储边长。也为正方形添加一个 :describe() 方法。
  • main.lua:将所有内容组合起来,创建这两种形状的实例,并演示它们能正确继承自 Shape,同时保留各自独有的属性。

你会收到两个输入:

  1. 圆形数据:颜色和半径,两者用逗号分隔(例如:blue,5)
  2. 正方形数据:颜色和边长,两者用逗号分隔(例如:red,4)

在主文件中,使用给定的值创建一个 Circle 和一个 Square。然后分别在单独的行上打印以下内容:

  1. 对圆形调用 :describe()
  2. 对正方形调用 :describe()
  3. 使用 :getColor() 打印圆形的颜色
  4. 使用 :getColor() 打印正方形的颜色

Circle 的 :describe() 方法应该打印:

Circle with radius {radius}

Square 的 :describe() 方法应该打印:

Square with side {side}

例如,如果输入是 blue,5 和 red,4,输出应该是:

Circle with radius 5
Square with side 4
blue
red

这展示了完整的继承模式:两种形状都继承了 Shape 的 :getColor()(它们不会自行定义这个方法),同时各自拥有独有的属性和 :describe() 方法!

亲手试试

-- main.lua:将所有部分组合起来

local Circle = require('Circle')
local Square = require('Square')

-- 读取圆形的输入(color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)

-- 读取正方形的输入(color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)

-- TODO:用给定的颜色和半径创建一个 Circle 实例

-- TODO:用给定的颜色和边长创建一个 Square 实例

-- TODO:在圆形上调用 :describe()

-- TODO:在正方形上调用 :describe()

-- TODO:使用 :getColor() 输出圆形的颜色

-- TODO:使用 :getColor() 输出正方形的颜色

面向对象编程中的所有课

自己练习: Lua 在线编译器