Lua面向对象之三:其它一些尝试
1.尝试一:子类对象调用被覆盖了的父类函数
根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了
①在子类Circle中增加一个调用父类方法的函数
--调用父类被子类覆盖了的name方法
function Circle:sharp_name()
local circle_metatable = getmetatable(self)
local sharp_metatable = getmetatable(circle_metatable)
sharp_metatable["name"]()
end
②调用结果(完全正确)
2.尝试二:不使用全局表作为元表
①在上两篇中,使用全局表作为元表:
下图是父类以Sharp作为元表
下图是子类以Circle作为元表
②修改元表过程
将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 = 2 --覆盖赋值
circle:sharp_func() --调用父类函数
circle:circle_func() --调用新函数
circle:name() --调用覆盖函数
circle:val() --调用覆盖函数
local circle_2 = Circle:new()
circle_2._val = 3
circle_2:val()
circle:val() --再次调用测试
④输出结果(完全正确)
⑤这时候调用被子类覆盖的父类函数就需要修改为
--调用父类被子类覆盖了的name方法
function Circle:sharp_name()
local circle_metatable = getmetatable(self)
local sharp_metatable = getmetatable(circle_metatable.__index)
sharp_metatable.__index["name"]()
end
⑥输出结果(完全正确)
Lua面向对象: