lua 面向对象 self探究

整体参考博客 : 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()

测试结果: 

分析:

  1. Class:show() ,SubClass:show(), obj1:show()  中运行的self显示的都是操作的自身对象,没什么含糊的。
  2. 构造函数里的self都是本类的静态类的对象,也就是操作的静态工具类,本类全局唯一一个静态类。符合上条原则
  3. 通过类名直接访问的都是静态类和静态方法以及静态变量,都是唯一全局的。创建的新类访问时一定要注意静态方法及静态变量的操作。就是c/c++中的static 成员变量。
  • 综合1、2两条,self就是操作该函数的类对象,通过谁操作的该函数,函数内部的self就是该类对象

函数重写

当我把重写函数 SubClass:show() 屏蔽掉后,所有对象对show的访问都会访问到父类的show函数,运行结果如下。依然符合上面的结论。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值