lua 定义类 就是这么简单

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

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

时间: 2024-11-02 21:06:58

lua 定义类 就是这么简单的相关文章

ios自己定义类(UIView)代码生成简单的UITableViewCell

因为一个项目中有大量的UITableViewCell须要书写,样式几乎相同都是 文字介绍:显示内容 这种. 自己又懒得写UITableViewCell类嫌不是必需:在方法tableView:cellForRowAtIndexPath中手写又繁琐.就封装变化写了一个UIView类. 项目:点击下载 构思:首先因为文字介绍和显示内容的宽度固定,然后Cell的一行(Cell能够包含多行)高度就是文字介绍和显示内容所须要的高度两者相比高一些的.下一行就是高度累加反复.Cell的最上端和最下端给个高度.最

【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三】动手绑定自己定义类至Lua

查看[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步.绑定自己定义C++类至Lua. 其实引擎为了方便我们应对不同平台,已经帮我们创建了不同平台的project项目. 为了编辑代码方便.我使用VS2013打开了"runtime-src"文件夹下的"proj.win32"project. 前往项文件夹径"F:\Cocos2dx-Lua\Garfie

【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之四】使用绑定C++至Lua的自己定义类

续[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三]动手绑定自己定义类至Lua 之后.我们已经完毕了自己定义类至Lua的绑定.在接下来的环节,我们将使用它. 首先,我们须要确定,通过Python脚本我们生成了哪些绑定文件?我们罗列一个表单. // Path : F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 1. lua_pet_auto.hpp // Path

201506300917_《Javascript权威指南(第六版)——类和模块、定义类三步法、定义简单类的函数 》(P200-210)

一. 类和模块 1. 类的实现基于原型继承机制的. 二. 类和原型 三. 类和构造函数 1. 构造函数是用来初始化新创建的对象的. 2. 使用new,所以,构造函数只要初始化对象状态即可. 3. 构建构造函数即是定义类,所以首字母要大写. 4. 四. 构造函数和类的标识 五. constrctor属性 1. constructor属性的值是一个函数对象 例如: var F = function() {}; //这是一个函数对象: var p = F.prototype;  //原型对象 var

(转载)我所理解Cocos2d-x 3.6(Lua):Cocos如何绑定Lua自定义类

我所理解Cocos2d-x 3.6(Lua):Cocos如何绑定Lua自定义类 热血枫叶2015-06-19 16:27:182289 次阅读 Cocos2d-x 2.x 与 Cocos2d-x 3.x 差异(tolua++) Cocos2d-x在2.x版本里就是用toLua++和.pkg文件这么把自己注册进Lua环境里的,然而从Cocos2d-x 3.x开始,用bindings-generator脚本代替了toLua++. bindings-generator脚本的工作机制是: 1.不用编写.

java定义类 对象,引用,指针

java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构造器*N个 成员变量*N个 方法*N个 } 1.类的修饰符只能是public final abstract 三种之一,或者不修饰 ,类名一般大写开头,驼峰命名 (一).成员变量的定义 [修饰符] 数据类型  变量名 : [修饰符] 数据类型  变量名  = 默认值: 1.修饰符:  可以不写(默认)

Javascript定义类(class)的三种方法

注:本文转自阮一峰,觉得此篇文章对我对大家有帮助,因此转过来. 将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越庞大的项目.Javascript代码的复杂度也直线上升.单个网页包含10000行Javascript代码,早就司空见惯.2010年,一个工程师透露,Gmail的代码长度是443000行! 编写和维护如此复杂的代码,必须使用模块化策略.目

JavaScript定义类与对象的一些方法

最近偶然碰到有朋友问我"hoisting"的问题.即在js里所有变量的声明都是置顶的,而赋值则是在之后发生的.可以看看这个例子: 1 var a = 'global'; 2 (function () { 3     alert(a); 4     var a = 'local'; 5 })(); 大家第一眼看到这个例子觉得输出结果是什么?'global'?还是'local'?其实都不是,输出的是undefined,不用迷惑,我的题外话就是为了讲这个东西的. 其实很简单,看一看JavaS

使用Resources类搭建Unity简单的资源管理工具类

Unity资源加载的方式有: 1.脚本拖拽(本地) 2.Resources加载(本地) ★ 3.AssetBundle加载(本地,远程[www])★ 本篇将使用Resources类搭建一个简单的资源管理工具类 Resources是Unity下的特殊文件夹,使用需自行创建Resources文件夹(命名必须正确) 使用Resources文件夹就需要用到Resources类的一些方法,如下: Resources类 Load 从Resources文件夹加载单个资源(可指定类型) LoadAll 从Res