Lua程序设计(三)面向对象实现一个简单的类

 1.Lua面向对象实现步骤

①创建一个全局表(称之为元表)

②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法)__index 赋值其实是一个function的语法糖,Sharp.__index = Sharp等价于Sharp.__index = function(key) return Sharp[key] end 

 

③新建一个表,使用setmetatable方法将元表设置到这个新表中,那这个新表就能以对象的方式来调用对应的属性和方法了,当这个对象调用属性或者函数时,首先查找自身的元表,如果找到则返回;如果没找到,则检查元表中是否有__index,如果有,则使用__index的值继续查找,直到没有__index为止。

2.例子

①代码 

Sharp = { _val = 1}  --①  父类

function Sharp:new()
    local new_sharp = { }
    self.__index = self  --②,self == Sharp
    setmetatable(new_sharp, self)  --③

    return new_sharp
end

function Sharp:sharp_func()
    print("Sharp call sharp_func")
end

function Sharp:name()
    print("Sharp call name")
end

function Sharp:val()
    print(string.format("Sharp call val %d", self._val))
end

②调用代码

local sharp = Sharp:new()
sharp:sharp_func()
sharp:name()
sharp:val()

 ③输出结果

 

3.自己写一个类

class1.lua

local ok, new_tab = pcall(require, "table.new")
if not ok or type(new_tab) ~= "function" then
    new_tab = function (narr, nrec) return {} end
end

local _M = new_tab(0, 54)       --①  父类

_M._VERSION = '0.01'

function _M:new()
    local new_obj = {}
    self.__index = self          --②,self == _M
    setmetatable(new_obj, self)
    return new_obj
end

-- 定义个简单的方法
function _M:func()
    print("Function func ")
end

return _M

简单的调用

local class01 = require "class1"
print("_VERSION == "..class01._VERSION)
local func = class01:func()
print(func)

打印结果

_VERSION == 0.01
Function func
nil

 

时间: 2024-10-28 20:01:15

Lua程序设计(三)面向对象实现一个简单的类的相关文章

python使用线程封装的一个简单定时器类实例

  本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = N

c#-求大神来帮助C#,一个简单学生类

问题描述 求大神来帮助C#,一个简单学生类 定义枚举类型 Public enum SexType {男, 女, 未知}: Public enum ProTitle (助教,讲师,副教授.教授.未知) Public enum StuTitle {班长,副班长,学委,学员} 定义下面类 Person类(抽象类) 包含的字段:姓名Name(字符串型).身高Height(单精度型,单位:米).体重Weight(单精度,单位:kg).性别Sex(枚举类型SexType) 包含的属性:身份证号ID(字符串型

解析xml文档的一个简单php类

xml //原创,可以自由使用,欢迎提出改进意见, <?PHP//xml中的元素class XMLTag{ var $parent;//父节点 var $child;//子节点 var $attribute;//本节点属性 var $data;//本节点数据 var $TagName;//本节点名称 var $depth;//本节点的深度,根节点为1 function XMLTag($tag='') {  $this->attribute = array();  $this->child

一个简单的类代码生成器

花了一点点时间,写了一个类玩玩,希望有点用. 类是怎么用的呢? 比如:输入: public className;private String variable1;private Integer variable2;private Double variable3; 点击 Generate!,后,输出: public className { private String variable1; private Integer variable2; private Double variable3;p

Lua中的面向对象编程详解_Lua

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 复制代码 代码如下: local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 print(tb1.a) 上述代码会输

《Python语言程序设计》——2.2 编写一个简单的程序

2.2 编写一个简单的程序 关键点:编写一个涉及设计解决问题的策略的程序,然后使用程序设计语言实现这些策略.首先,让我们来看一个计算圆面积的简单问题.我们该如何编写程序来解决这个问题呢?编写程序涉及如何设计算法以及如何将算法翻译成程序设计指令或代码.当你编写代码时--即你在编写程序时--你就将一个算法翻译成一段程序.算法描述的是如何通过列出要进行的动作和这些动作的执行顺序来解决一个问题.算法可以帮助程序员在使用程序设计语言编程之前做一个规划.算法可以用自然语言或伪代码(即自然语言与某些程序设计代

一个简单的自动发送邮件系统(三)

一个简单的自动发送邮件系统(三)     这里介绍php和mysql结合起来实用.如何从mysql数据库中提取数据.     好,我们已经成功的完成了我们的要求,很多的数据已经存在了数据库中,现在的问题是,如何查询这些数据,得到有用的结果呢? 在下面的程序中,我们将选择"apple"的用户输出. -------------------------------------------------------- <?    /* 声明一些必须的变量*/ $hostname = &qu

一个简单的自动发送邮件系统(三)_php基础

一个简单的自动发送邮件系统(三)     这里介绍php和mysql结合起来实用.如何从mysql数据库中提取数据.     好,我们已经成功的完成了我们的要求,很多的数据已经存在了数据库中,现在的问题是,如何查询这些数据,得到有用的结果呢? 在下面的程序中,我们将选择"apple"的用户输出. -------------------------------------------------------- <? /* 声明一些必须的变量*/ $hostname = "

C++程序设计:原理与实践(进阶篇)15.6 实例:一个简单的文本编辑器

15.6 实例:一个简单的文本编辑器 列表最重要的性质就是可以在不移动元素的情况下对其进行插入或删除操作.下面我们通过一个例子来说明这一点.考虑应该如何在文本编辑器中表示一个文本文件中的字符.所选用的表示方式应当能够使对文本文件进行的操作简单而高效. 那么具体会涉及哪些操作呢?假设文件能存储在计算机的内存中.也就是说,我们可以选择任何一种适合的表示方式,当需要保存到文件中时,只要把它转换成一个字节流就可以了.相应地,我们也可以把一个文件中的字符转成字节流,从而把它读入内存中.这说明我们只需要选择