在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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面向对象: |
请发表评论