文档章节

lua简易面向对象

书香神
 书香神
发布于 05/05 13:21
字数 746
阅读 4
收藏 0

本文介绍一下lua面向对象的实现方法,只摘取最有用最核心的部分进行介绍,因为之前也看过一些面向对象的实现,功能很完善,同时也略显复杂。本文会尽量用最简洁的方式把lua面向对象描述清楚,一看便知。

1.LUA元表

本文使用lua元表实现面向对象,所以先要介绍下lua的元表。元表中有很多的元方法,这里不会全部介绍,仅仅只介绍__index这个元方法。

1.1 __index

直接说明__index的作用:lua中当用下标访问一个表的成员时, 分下面几个步骤:
(1) 根据key值查找表A成员a, 若无则下一步
(2) 判断表A是否有元表B, 若无则返回nil, 有则下一步
(3) 若元表B有__index成员则: 分两步走
	a. __index是一个表: 在__index表中查找a
	b. __index是一个函数: 返回__index的返回值
什么意思呢?看下面的例子:

`
--定义一个表
local mytable = {a = "1"};

--打印看看, 这里'mytable.b == nil'
print(mytable.a);
print(mytable.b);

--再定义一个元表
local mymetabl = {__index = {b = "2"}};

--将这个元表设置为'mytable'的元表
setmetatable(mytable, mymetatable);

--再打印看看, 发现这里'mytable.b == "2"'
print(mytable.a);
print(mytable.b);
`

看出来了吗,在mytable中索引b时, 没有找到, 然后判断是否有元表, 发现有元表就在元表中索引b。这是__index为一个表的情况,还有一种情况__index为一个函数,这里就不说了。

#2. 简单面向对象 说明直接写在注释里面, 有两个.lua文件, 'class.lua'是类的实现,'main.lua'是测试类的功能. class.lua:

```
print("class.lua")

classList = {};

class = {};

--定义一个类
class.define = function(self, className, template, baseClass)
	print("class.define: className = ", className);
	local curClass = template or {};
	curClass.className = className;

	if baseClass then
		setmetatable(curClass, {__index = baseClass});
		curClass.parent = baseClass;
	end

	classList[className] = curClass;
end

--创建一个类的实例
class.new = function(self, className)
	print("class.new: className = ", className);
	local instance = {};

	if classList[className] then
		setmetatable(instance, {__index = classList[className]});
	end

	return instance;
end

function getClassByName(className)
	print("getClassByName:", className);
	return classList[className] or nil;
end

return class;

```

main.lua
```
--应用模块
local class = require(".\class");
require('mod1');


--定义基类
class:define("baseClass", {
	name = "baseClass",
	id = 0,
	getId = function(self)
		print("baseClass.id = ", self.id);
	end,
});

--定义子类1
class:define("childClass1", {
		id = 1,
	},
	getClassByName("baseClass")
);

--定义子类2
class:define("childClass2", {
		id = 2,
		getId = function(self)
			print("childClass2.id = ", self.id);
		end,
	},
	getClassByName("baseClass")
);

--子类1的一个实例
local insChild1 = class:new("childClass1");

--子类2的一个实例
local insChild2 = class:new("childClass2");

print("end:");
var_dump(classList);

--调用到了基类的'getId'方法
insChild1:getId();

--调用子类2自己的'getId'方法
insChild2:getId();

--调用子类2的父类的'getId'方法
insChild2.parent:getId();
```

© 著作权归作者所有

书香神
粉丝 0
博文 4
码字总数 4658
作品 0
深圳
程序员
私信 提问
LuaScriptCore v1.3.0,移动端 Lua 桥接框架

LuaScriptCore旨在能够在多种平台上方便地使用Lua。其提供了与各种平台的功能交互(目前支持iOS、Android以及OS X),让开发者无须关心Lua与各个平台之间是实现交互的细节,只需要根据自己的...

vimfung
2017/03/11
770
7
跨平台移动应用开发引擎--LuaApp

LuaApp是使用lua脚本进行快速开发跨平台移动应用引擎,其api的设计按照面向对象原则,并和CrossApp高度统一。 特性: api和CrossApp统一,方便使用CrossApp的开发者使用; 定制的布局系统,支...

zentel
2017/04/26
168
0
lua的私有性(privacy)

  很多人认为私有性是面向对象语言的应有的一部分。每个对象的状态应该是这个对象自己的事情。在一些面向对象的语言中,比如C++和Java你可以控制对象成员变量或者成员方法是否私有。其他一...

jeffjade
2014/11/30
0
0
LuaScriptCore v1.1.1发布,移动端 Lua 桥接框架

LuaScriptCore旨在能够在多种平台上方便地使用Lua。其提供了与各种平台的功能交互(目前支持iOS、Android以及OS X),让开发者无须关心Lua与各个平台之间是实现交互的细节,只需要根据自己的...

vimfung
2016/11/02
3.5K
6
Cocos2d-Lua手游开发基础篇-何韬-专题视频课程

Cocos2d-Lua手游开发基础篇—62875人已学习 课程介绍 Cocos2d-Lua是一个开源的移动游戏框架,可以轻松运行在iOS、Android、Blackberry等操作系统中,使得开发低成本、高效率;一次制作,多终...

pkutao
2015/02/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
5
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
5
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
19
0
jupyter部署安装

python373 -m ipykernel install --name python373 ipython kernelspec list sc create myjupyterservice binpath="D:\apply\Python373\Scripts\jupyter-notebook --config=V:/my_work/jupyt......

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部