Lua 自己实现类Class代码,和高级用法
来源:互联网 发布:mac装win7单系统 编辑:程序博客网 时间:2024/04/28 10:08
Class代码实现:
function class(classname, super) local superType = type(super) local cls if superType ~= "function" and superType ~= "table" then superType = nil super = nil end if superType == "function" or (super and super.__ctype == 1) then -- inherited from native C++ Object cls = {} if superType == "table" then -- copy fields from super for k,v in pairs(super) do cls[k] = v end cls.__create = super.__create cls.super = super else cls.__create = super cls.ctor = function() end end cls.__cname = classname cls.__ctype = 1 function cls.new(...) local instance = cls.__create(...) -- copy fields from class to native object for k,v in pairs(cls) do instance[k] = v end instance.class = cls instance:ctor(...) return instance end else -- inherited from Lua Object if super then cls = {} setmetatable(cls, {__index = super}) cls.super = super else cls = {ctor = function() end} end cls.__cname = classname cls.__ctype = 2 -- lua cls.__index = cls function cls.new(...) local instance = setmetatable({}, cls) instance.class = cls instance:ctor(...) return instance end end return clsend
创建一个类
lua中
高级用法
class() 除了定义纯 Lua 类之外,还可以从 C++ 对象继承类。比如需要创建一个工具栏,并在添加按钮时自动排列已有的按钮,那么我们可以使用如下的代码:
lua中
//定义名为 Shape 的基础类local Shape = class("Shape")//ctor() 是类的构造函数,在调用 Shape.new() 创建 Shape 对象实例时会自动执行function Shape:ctor(shapeName) self.shapeName = shapeName printf("Shape:ctor(%s)", self.shapeName)end//为 Shape 定义个名为 draw() 的方法function Shape:draw() printf("draw %s", self.shapeName)end// Circle 是 Shape 的继承类local Circle = class("Circle", Shape)function Circle:ctor() -- 如果继承类覆盖了 ctor() 构造函数,那么必须手动调用父类构造函数 -- 类名.super 可以访问指定类的父类 Circle.super.ctor(self, "circle") self.radius = 100endfunction Circle:setRadius(radius) self.radius = radiusend// 覆盖父类的同名方法function Circle:draw() printf("draw %s, raidus = %0.2f", self.shapeName, self.raidus)end--local Rectangle = class("Rectangle", Shape)function Rectangle:ctor() Rectangle.super.ctor(self, "rectangle")end--local circle = Circle.new() -- 输出: Shape:ctor(circle)circle:setRaidus(200)circle:draw() -- 输出: draw circle, radius = 200.00local rectangle = Rectangle.new() -- 输出: Shape:ctor(rectangle)rectangle:draw() -- 输出: draw rectangle
高级用法
class() 除了定义纯 Lua 类之外,还可以从 C++ 对象继承类。比如需要创建一个工具栏,并在添加按钮时自动排列已有的按钮,那么我们可以使用如下的代码:
// 从 cc.Node 对象派生 Toolbar 类,该类具有 cc.Node 的所有属性和行为local Toolbar = class("Toolbar", function() return display.newNode() -- 返回一个 cc.Node 对象end)//构造函数function Toolbar:ctor() self.buttons = {} -- 用一个 table 来记录所有的按钮end//添加一个按钮,并且自动设置按钮位置function Toolbar:addButton(button) // 将按钮对象加入 table self.buttons[#self.buttons + 1] = button //添加按钮对象到 cc.Node 中,以便显示该按钮 // 因为 Toolbar 是从 cc.Node 继承的,所以可以使用 addChild() 方法 self:addChild(button) // 按照按钮数量,调整所有按钮的位置 local x = 0 for _, button in ipairs(self.buttons) do button:setPosition(x, 0) -- 依次排列按钮,每个按钮之间间隔 10 点 x = x + button:getContentSize().width + 10 endendclass() 的这种用法让我们可以在 C++ 对象基础上任意扩展行为。既然是继承,自然就可以覆盖 C++ 对象的方法:function Toolbar:setPosition(x, y) // 由于在 Toolbar 继承类中覆盖了 cc.Node 对象的 setPosition() 方法 // 所以我们要用以下形式才能调用到 cc.Node 原本的 setPosition() 方法 getmetatable(self).setPosition(self, x, y) printf("x = %0.2f, y = %0.2f", x, y)end
**注意:** Lua 继承类覆盖的方法并不能从 C++ 调用到。也就是说通过 C++ 代码调用这个 cc.Node 对象的 setPosition() 方法时,并不会执行我们在 Lua 中定义的 Toolbar:setPosition() 方法。
0 0
- Lua 自己实现类Class代码,和高级用法
- class() 高级用法 -- lua
- [Lua] class() 高级用法
- class() 高级用法 --cocos2dx- lua
- Lua的类Class实现
- Android ValueAnimator和ObjectAnimator的高级用法(代码实现)
- class高级用法
- 自己实现lua table
- cocos2dx lua中使用class实现继承api中的类
- partial class 在ORM中使用局部类,可以自动生成的代码和自己写的代码分开
- lua 类继承和实现
- ci高级用法篇之创建自己的类库
- Lua自己实现angle角
- 自己实现的atof()和atoi()代码
- Class定义和用法
- "||" 和 "&&"高级用法
- cocos2dx-lua里面class的实现的一些问题记录和思考
- java中Class.getResource用法和自己老是有事没事报NullPointer错误的原因分析
- 如何用PHP简单写App接口
- 用循环代替递归防止栈溢出
- 8.22总结
- poj 3007 Organize Your Train part II
- Retrofit2使用方式和源码解析
- Lua 自己实现类Class代码,和高级用法
- 在phpmyadmin中修改了数据库的密码之后,发现再次打开时,禁止访问了?
- 个人主页的制作
- Android Handler 异步消息处理机制二:源码解析,深入理解Looper、Handler、Message三者关系
- UEFI+GPT+USB3.0+SSD 安装win7(X64)
- 3MULTI-DIMENSIONAL SIGNAL PROCESSING AND CIRCUITS FOR ADVANCED ELECTRONICALLY SCANNED ANTENNA ARRAYS
- 小度wifi启动提示应用程序错误
- 回溯法解决八皇后问题(循环/递归)
- null与undefined的区别