整体参考博客 : lua的面向对象编程,封装,继承,多态的实现
lua面向对象中的self目前对我来说是一个迷,迷之混乱,所以觉得测之。。。
测试代码:
--------父类---------------------------------------------
Class = {}
Class.cnt = 0
--Class.name = "base class"
Class.__index = Class
function Class:new(name)
local obj = {}
setmetatable(obj, Class)
obj.name = name
obj.data = {}
obj.cnt = 0
Class.cnt = Class.cnt + 1
obj.cnt = obj.cnt + 1
print("Class >new ", self)
return obj
end
function Class:show()
-- body
print("Class >show", self)
end
--------子类------------------------------------------
SubClass = {}
setmetatable(SubClass, Class)
SubClass.__index = SubClass
function SubClass:new(name)
local obj = Class:new(name)
setmetatable(obj, SubClass)
print("SubClass > new ", self)
-- table.insert( self.data, 3)
return obj
end
function SubClass:show()
-- body
print("SubClass >show ", self, Class)
end
local obj1 = SubClass:new("xiaoming")
print('------------------------')
print("Class ", Class)
print("SubClass ", SubClass)
print("obj ", obj1)
print("-------------------------")
Class:show()
SubClass:show()
obj1:show()
测试结果:
分析:
- Class:show() ,SubClass:show(), obj1:show() 中运行的self显示的都是操作的自身对象,没什么含糊的。
- 构造函数里的self都是本类的静态类的对象,也就是操作的静态工具类,本类全局唯一一个静态类。符合上条原则
- 通过类名直接访问的都是静态类和静态方法以及静态变量,都是唯一全局的。创建的新类访问时一定要注意静态方法及静态变量的操作。就是c/c++中的static 成员变量。
- 综合1、2两条,self就是操作该函数的类对象,通过谁操作的该函数,函数内部的self就是该类对象。
函数重写
当我把重写函数 SubClass:show() 屏蔽掉后,所有对象对show的访问都会访问到父类的show函数,运行结果如下。依然符合上面的结论。