• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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面向对象:

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

Lua面向对象之二:类继承

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap