热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

1.尝试一:子类对象调用被覆盖了的父类函数根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了①在子类Circle中增加一个调用父类方法的函数--调用父类被子类覆盖了的na

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 = 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() --再次调用测试

④输出结果(完全正确)

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面向对象之三:其它一些尝试》


推荐阅读
author-avatar
抑制不L挑逗烛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有