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

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

Lua面向对象之二:类继承

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

posted @ 2016-10-20 17:12  pcwen.top  阅读(716)  评论(0编辑  收藏  举报
pcwen.top