在重写基类某些方法时,有可能不是直接覆盖重写掉,还需要调用基类方法。
测试代码如下:
--------父类---------------------------------------------
Class = {}
Class.__index = Class
function Class:new()
local obj = {}
setmetatable(obj, Class)
return obj
end
function Class:show()
print("Class >show", self)
end
--------子类------------------------------------------
SubClass = {}
setmetatable(SubClass, Class)
SubClass.__index = SubClass
function SubClass:new()
local obj = Class:new()
setmetatable(obj, SubClass)
--self.__index = self --该处的操作和 SubClass.__index = SubClass 等价 ,因为 此处 self == SubClass 故选其中一个就可以
obj.base = Class --保存基类
return obj
end
function SubClass:show()
--方法1 [ self.base.show(self) ] --调用基类的方法
--方法2 其实base不用创建
Class.show(self) --直接操作基类即可
print("SubClass >show ", self)
end
local obj1 = SubClass:new()
print("Class ", Class)
print("SubClass", SubClass)
print("obj1 ", obj1)
print("----------------------")
obj1:show()
运行结果
在执行obj1:show()的时候去调用Class中的show()函数
注意不是直接调用Class:show(),而是在Class中的show()函数中执行obj1对象。
也就是在Class中show()函数的self为obj1对象。
其中,
Class.show(obj1) 输出调试显示其中的self就是obj1,即我们传进去的对象。
说明:
其实,元祖的冒号访问只是默认将本对象(就是自己)作为第一个参数传递入函数体内部。等价于点号访问函数并自己手动把自己传进去,当然也可以把别人传进去。
元表点号和冒号访问
local a = {name = "xiaozhang"}
function a:fun(other)
if self ~= a then
print("no me", self.name, other)
else
print("is me", self.name, other)
end
end
local b = {name = "xiaoming"}
a:fun("hello") --(1)
a.fun(a, "hello") --(2)
a.fun(b, "hello") -- (3)
输出结果
如上, (1)(2)两表达式等价 (3)式自定义输入对象