回顾:形状层级结构
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 36 课,共 70 课。
挑战
简单让我们从头开始构建一个完整的形状继承体系!你将创建一个 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,同时保留各自独有的属性。
你会收到两个输入:
- 圆形数据:颜色和半径,两者用逗号分隔(例如:
blue,5) - 正方形数据:颜色和边长,两者用逗号分隔(例如:
red,4)
在主文件中,使用给定的值创建一个 Circle 和一个 Square。然后分别在单独的行上打印以下内容:
- 对圆形调用
:describe() - 对正方形调用
:describe() - 使用
:getColor()打印圆形的颜色 - 使用
: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 在线编译器