• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

lua定义类就是这么简单

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在网上看到这样一段代码,真是误人子弟呀,具体就是:

lua类的定义

代码如下:

local clsNames = {}
local __setmetatable = setmetatable
local __getmetatable = getmetatable

function Class(className, baseCls)
    if className == nil then
        BXLog.e("className can't be nil")
        return nil
    end

    if clsNames[className] then
        BXLog.e("has create the same name, "..className)
        return nil
    end
    clsNames[className] = true
    
    local cls = nil
    if baseCls then
        cls = baseCls:create()
    else
        cls = {}
    end
    cls.m_cn = className

    cls.getClassName = function(self)
        local mcls = __getmetatable(self)
        return mcls.m_cn
    end

    cls.create = function(self, ...)
        local newCls = {}
        __setmetatable(newCls, self)
        self.__index = self
        newCls:__init(...)
        return newCls
    end

    return cls
end

 

这个代码的逻辑:
1.创建一个类,其实是创建了一个父类的对象。
然后指定自己的create.

2.创建一个类的对象,其实就是创建一个表,这个表的元表设置为自己。然后调用初始化。

上面是错误的思路。
----------------------------------------

 

我的理解:
1.创建类:创建一个表, 且__index指向父类。

2.创建对象:创建一个表,元表设置为类。

### 就是这么简单,只要看下面的cls 和inst 两个表就可以了。

我来重构,如下为核心代码:

function Class(className, baseCls)
    local cls = {}
    if baseCls then
        cls.__index = baseCls
    end

    function call(self, ... )
        local inst = {}
        inst.__index = self--静态成员等。
        setmetatable(inst, self)
        inst:__init(...)
        return inst
    end
    cls.__call = call

    return cls
end

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua table排序报错与解决发布时间:2022-07-22
下一篇:
4. Unity3d Lua框架 - xLua - LogicUpdater发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap