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

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 定义类 就是这么简单的更多相关文章

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

    因为一个项目中有大量的UITableViewCell须要书写,样式几乎相同都是 文字介绍:显示内容 这种. 自己又懒得写UITableViewCell类嫌不是必需:在方法tableView:cellF ...

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

        查看[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步.绑定自己定义C++类至Lu ...

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

    续[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三]动手绑定自己定义类至Lua 之后.我们已经完毕了自己定义类至Lua的绑定.在接下来的环节,我们将使用它. 首先,我们须要确定 ...

  4. 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之中的一个】环境搭建

    * 确定你安装了Android NDK R9B 版本号 ,假设没有前往下面地址下载. ( https://dl.google.com/android/ndk/android-ndk-r9b-linux ...

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

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  6. JS中定义类的方法

    JS中定义类的方式有很多种: 1.工厂方式    function Car(){     var ocar = new Object;     ocar.color = "blue" ...

  7. [转]Javascript定义类的三种方法

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...

  8. C#定义类成员

    1.成员定义 public--成员可以由任何代码访问. private--成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字). internal--成员只能由定义它的程序集(项目 ...

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

    java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构 ...

随机推荐

  1. 完全平方数(bzoj 2440)

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是 ...

  2. 洛谷 P 1514 引水入城==Codevs 1066

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  3. node总结--回调函数阻塞和非阻塞代码实例

    阻塞代码实例: var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data. ...

  4. gpio_direction_output vs gpio_set_value之间的使用关系

    在Linux驱动中常常会碰到gpio_set_value(port_num,0/1)或gpio_direction_output (port_num,0/1) 这两者有什么关系呢gpio_set_va ...

  5. MinGW 创建的程序或 DLL 脱离 libgcc-xx-xx.dll 和 libstdc++-x.dll 运行库的方法

    MinGW 沿袭了 Linux 下 gcc/g++ 的习惯,编译出的程序或者动态链接库(共享库)总是默认采用动态链接方式,需要系统中附带运行时库文件 libgcc-xx-xx.dll 和 libstd ...

  6. VS debug调试方法

    F5 开始调试,执行到断点 Shift + F5 停止调试 F9 在光标所在行添加断点 Shift + F9 QuickWatch Shift Ctrl F9 delete all 断点 F10 单步 ...

  7. Widows下利用OpenSSL生成证书

    1.下载OpenSSL的windows版本 32位:openssl-1.0.2a-i386-win32.zip 64位:openssl-1.0.2a-x64_86-win64.zip 下载之后解压即可 ...

  8. Html中的 http-equiv="X-UA-Compatible" 解释

    1.X-UA-Compatible X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的. 通过在meta中设置X-UA-Compatible的值,可以指定网页的 ...

  9. filter和spring 的interceptor都是单例的,都不是线程安全的

    Filter 是在 Servlet 容器启动时就初始化的,因此可以认为是以单例对象存在的,如果一个请求线程对其中的成员变量修改的话,会影响到其他的请求线程,因此认为是多线程不安全的.

  10. 正确使用Block避免Cycle Retain和Crash

    Block简介 Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存 ...