精华内容
下载资源
问答
  • 在网上看到这样一段代码...lua类定义 代码如下: local clsNames = {} local __setmetatable = setmetatable local __getmetatable = getmetatable function Class(className, baseCls) if className ...

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

    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

    转载于:https://www.cnblogs.com/hackerl/p/8710181.html

    展开全文
  • 用最简单的方法编写一个只能继承纯lua类的,lua类 function Class(classname,super) local class_info = {} setmetatable(class_info,{__index = function(owner,key) ::recheck:: if key:find("__") or owner...

    用最简单的方法编写一个只能继承纯lua类的,lua类

    function Class(classname,super)
        local class_info = {}
        setmetatable(class_info,{__index = function(owner,key)
            ::recheck::
            if key:find("__") or owner.__super == nil then return nil end
            local res = owner.__super[key]
            if res then return
                res
            else
                owner = owner.__super
                goto recheck
            end
        end})
        class_info.classname = classname
        class_info.__index = class_info
        class_info.__super = super
        class_info.new = function(...)
            local o = {}
            setmetatable(o,class_info)
            o.__index = o
            -- 在这里初始化类的实例对象
            -- o:ctor(...)
            -------------------------
            return o
        end
        return class_info
    end

    如何使用:

    1.不继承任何类型

    ClassA = Class("ClassA")
    function ClassA:test()
        print(ClassA.classname.."="..self.a)
    end

    2.继承Lua类模型

    ClassB = Class("ClassB",ClassA)
    function ClassB:test() 
        print(ClassB.classname.."="..self.a)
    end

    3.重载父类函数

    ClassB = Class("ClassB",ClassA)
    function ClassB:test()
        ClassA.test(self)
        print(ClassB.classname.."="..self.b)
    end

    该类模型满足:

    1.函数继承(例如代码段)

    ClassA = Class("ClassA")
    function ClassA:test()
        print(ClassA.classname.."="..self.a)
    end
    ClassB = Class("ClassB",ClassA)
    
    local b = ClassB.new()
    b.a = 100
    b:test()

    结果应输出: ClassA = 100

    2.重载父函数

    ClassA = Class("ClassA")
    function ClassA:test()
        print(ClassA.classname.."="..self.a)
    end
    ClassB = Class("ClassB",ClassA)
    function ClassB:test()
        ClassA.test(self)
        print(ClassB.classname.."="..self.b)
    end
    local b = ClassB.new()
    b.a = 100
    b.b = 50
    b:test()

    输出结果应为:

    ClassA = 100

    ClassB = 50

     

    3.多层继承

    ClassA = Class("ClassA")
    function ClassA:test()
        print(ClassA.classname.."="..self.a)
    end
    ClassB = Class("ClassB",ClassA)
    function ClassB:test()
        ClassA.test(self)
        print(ClassB.classname.."="..self.b)
    end
    ClassC = Class("ClassC",ClassB)
    function ClassC:test()
        ClassB.test(self)
        print(ClassC.classname.."="..self.a)
    end
    
    local c = ClassC.new()
    c.a = 100
    c.b = 50
    c:test()

    输出结果应为:

    ClassA = 100

    ClassB = 50

    ClassC = 100

    4.重载断链父函数

    ClassA = Class("ClassA")
    function ClassA:test()
        print(ClassA.classname.."="..self.a)
    end
    ClassB = Class("ClassB",ClassA)
    ClassC = Class("ClassC",ClassB)
    function ClassC:test()
        ClassB.test(self)
        print(ClassC.classname.."="..self.a)
    end
    
    local c = ClassC.new()
    c.a = 100
    c.b = 50
    c:test()
    

    输出结果应为:

    ClassA = 100 

    ClassC = 100

    写法优化

    上面写法在调用父类函数时需要指定类名,可以改为如下写法(前提条件:每个类单独占用一个lua文件)

    local super = ClassA
    ClassB = Class("ClassB",super)
    function ClassB:test()
        super.test(self)
        print(ClassB.classname.."="..self.a)
    end
    
    function ClassB:test2()
        super.test2(self)
        print(ClassB.classname.."="..self.b)
    end

    end...

    展开全文
  • lua类定义

    2019-02-16 16:58:05
    lua类定义 代码如下: local clsNames = {} local __setmetatable = setmetatable local __getmetatable = getmetatable function Class(className, baseCls) if className == nil then BXLog.e("...

    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
    展开全文
  • lua定义一个简单的

    2016-12-15 15:39:00
    classA.lua: classA = { a = 0, b = 0,}; classA.meta = {__index = classA} function classA:new(a, b) local o = {}; setmetatable(o, self.meta); o.a = a; o.b = b; ...

    classA.lua:

    classA =
    {
      a = 0,
      b = 0,
    };

    classA.meta = {__index = classA}


    function classA:new(a, b)
      local o = {};
      setmetatable(o, self.meta);

      o.a = a;
      o.b = b;

      return o;
    end

    function classA:getA()
      return self.a;
    end

    function classA:getB()
      return self.b;
    end

     

    main.lua:

    require("classA");
    local test_a = classA:new(1, 2);
    print('test_a.a = ' .. test_a:getA());
    print('test_a.b = ' .. test_a:getB());

    转载于:https://www.cnblogs.com/afan/p/6183496.html

    展开全文
  • lua的方法定义

    2019-10-09 07:06:29
    tbl={} function tbl:x() print("x") end tbl.x() 和下面的输出结果一样 : 和 . 的效果一样 tbl={} function tbl.x() print("x") end tbl.x() ... 版权声明:本文为博主原...
  • <li>How to create lua class equivalent to one described in <a href="http://lua-users.org/wiki/SimpleLuaClasses" rel="nofollow">A Simplified Way to Declare Lua Classes</a>? <li>How to add "magic ...
  • --=====Account Start========== local Account = { balance = 0, -- withdraw = function(self, v) -- self.balance = self.balance - v -- end, } function Account : withdraw(v) if v >
  • 3.3 怎样绑定自己定义类Lua之三】动手绑定自己定义类Lua 之后。我们已经完毕了自己定义类Lua的绑定。在接下来的环节,我们将使用它。 首先,我们须要确定,通过Python脚本我们生成了哪些绑定文件?我们罗列...
  • // The general pattern to binding C++ class to Lua is to write a Lua // thunk for every method for the class, so here we go: int l_Foo_constructor(lua_State * l) { const char * name = luaL_...
  • lua实现

    2018-07-24 16:41:24
    今天再看一遍项目实现lua类的方式,终于看明白了,做下记录,主要思想如下: 1.首先lua中的肯定也是table,在中用一个__tbl_Baseclass__的表有序...2.要让对实例对象的访问都转到定义上 其中用到的一些lua...
  • 查看【Quick-COCOS2D-X 3.3 怎样绑定自己定义类Lua之二】新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步。绑定自己定义C++类至Lua。 其实引擎为了方便我们应对不同...
  • lua类

    2015-10-07 16:43:21
    Lua不存在的概念,每个对象定义他自己的行为并拥有自己的形状(shape)。然而,依据基于原型(prototype)的语言比如Self和NewtonScript,在Lua中仿效的概念并不难。在这些语言中,对象没有。相反,每个对象都...
  • 一直对脚本语言的有压力,担心项目...但用COCOS2DX3.2创建项目后发现官方DEMO带了LUA自定义“”,特别神奇。 首先创建文件GameScene.lua 在main.lua使用该“” local scene = require("GameSc
  • lua 模拟的实现

    2020-05-09 08:49:30
    lua没有的概念,这让人用起来很头疼。 今天来写一个模拟,写之前想想:的基本作用是什么? 作为一个对象,有自己的变量,方法。 lua当中就有这么一个万能格式,table,变量和方法就相当于他的一个值嘛。 所以...
  • lua与继承

    千次阅读 2015-02-28 14:41:14
    Lua 不存在的概念,每个对象定义他自己的行为并拥有自己的形状(shape) 。在这些语言中, 对象没有。 相反, 每个对象都有一个 prototype(原型) ,当调用不属于对象的某些操作时,会最先会到 prototype 中...
  • Lua类

    2018-06-21 09:04:54
    可以不在初始化里面 定义某个成员修改成员函数里面必须要使用 类名.成员调用自己的成员函数 使用self : 函数名下面是一个装备的例子。网上有些教程,写得十分不清楚,而且重新赋值就会覆盖之前的值。 必须要...
  • 2个lua文件 A B , B继承A A: function A:func1() ... end A.item1 = { ["item"] = self.func1 } function A:func2() ... end B: function B:init() .... self:func2() ... end ...
  • lua简单的实现

    2017-06-23 09:33:00
    lua简单的实现 原文地址:http://blog.csdn.net/qqmcy/article/details/37725177 实现: MyClass = class("MyClass") --这句话是重定义元表的索引,必需要有 MyClass.__index = MyClass ...
  • lua类对象

    2017-09-13 12:00:00
    --这里是Lua对象实例化方法--...--这句是重定义元表的索引,就是说有了这句,这个才是一个LuaClass.__index = LuaClass --构造体,构造体的名字是随便起的,习惯性改为New() function LuaClass:New(x...
  • lua 实现继承和覆盖

    千次阅读 2016-03-17 21:13:15
    lua 实现继承和覆盖lua也可以通过一些方式实现的继承先介绍要用到的几个知识点: metatable __index selfmetatable:表示文件的元表 元表里记录了 函数、table访问、操作符行为 说明:定义一个函数,函数名,...
  • 定义Lua中嵌套的Lua自定义 -- Lua当中的一个自定义 table同用 testClass ={ testInt = 2; testFloat = 1.3; testBool = true; testString = "567"; testFun = function() print("this is a test fun") ...
  • 基类:基类定义了所有对于派生来说普通的属性和方法,派生从基类继承所需的属性和方法,且在派生中增加新的属性和方法。 继承:继承是C++语言的一种重要机制,它允许在已定义的基础上产生新。 ...
  • cocos2d-x在2.x版本里就是用toLua++和.pkg文件这么把自己注册进Lua... bindings-generator脚本的工作机制是: 1、不用编写.pkg和.h文件了,直接定义一个ini文件,注册到Lua环境里的模块名是什么,就行了。 2、摸...
  • 一、cocos2d-lua继承的代码 打开src->framework->function...也就是说通过 C++ 代码调用这个 cc.Node 对象的 setPosition() 方法时,并不会执行我们在 Lua定义的 Toolbar:setPosition() 方法。 @param string clas

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 531
精华内容 212
关键字:

lua定义类