Lua面向对象之三:其它一些尝试

时间:2021-03-09 17:07:36

1.尝试一:子类对象调用被覆盖了的父类函数

根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了

①在子类Circle中增加一个调用父类方法的函数

--调用父类被子类覆盖了的name方法
function Circle:sharp_name()
local circle_metatable = getmetatable(self)
local sharp_metatable = getmetatable(circle_metatable)
sharp_metatable["name"]()
end

②调用结果(完全正确)

Lua面向对象之三:其它一些尝试

2.尝试二:不使用全局表作为元表

①在上两篇中,使用全局表作为元表:

下图是父类以Sharp作为元表

Lua面向对象之三:其它一些尝试

下图是子类以Circle作为元表

Lua面向对象之三:其它一些尝试

②修改元表过程

将Sharp的创建函数修改为

function Sharp:new()
local new_sharp = { } local metatable = {}
metatable.__index = self --②,self == Sharp
setmetatable(new_sharp, metatable) --③ 使用metatable作为元表 return new_sharp
end

将Circle的创建函数修改为

function Circle:new()
local new_circle = {} local metatable = {}
metatable.__index = self --②,self == Circle
setmetatable(new_circle, metatable) --③使用metatable作为元表 return new_circle
end

③调用函数

local circle = Circle:new()
circle._val = --覆盖赋值
circle:sharp_func() --调用父类函数
circle:circle_func() --调用新函数
circle:name() --调用覆盖函数
circle:val() --调用覆盖函数 local circle_2 = Circle:new()
circle_2._val =
circle_2:val() circle:val() --再次调用测试

④输出结果(完全正确)

Lua面向对象之三:其它一些尝试

⑤这时候调用被子类覆盖的父类函数就需要修改为

--调用父类被子类覆盖了的name方法
function Circle:sharp_name()
local circle_metatable = getmetatable(self)
local sharp_metatable = getmetatable(circle_metatable.__index)
sharp_metatable.__index["name"]()
end

⑥输出结果(完全正确)

Lua面向对象之三:其它一些尝试

Lua面向对象:

Lua面向对象之一:简单例子

Lua面向对象之二:类继承

Lua面向对象之三:其它一些尝试