lua面向对象编程 《lua程序设计》 16章 笔记

简介: Lua中的table就是一种对象,即它拥有状态、拥有独立于其值的标识(self)、table与对象一样具有独立于创建者和创建地的征集周期 什么叫对象拥有独立的生命周期? Account = {balance = 0} function Account.

Lua中的table就是一种对象,即它拥有状态、拥有独立于其值的标识(self)、table与对象一样具有独立于创建者和创建地的征集周期

什么叫对象拥有独立的生命周期?

Account = {balance = 0}

function Account.withdraw(v)
    Account.balance = Acount.balance-v
end

--则可进行如下调用

Account.withdraw(v)

--[[在函数中使用全局名称Account不是个了习惯
    因为这个函数只能针对特定对象使用(此例中
    的Account,并且这个特定对象必须存储在特定
    全局变量中,如果改变了对象名称,withdraw
    就不工作了

a = Account;Account = nil
a.withdraw(100.00)  --错误

这种行为违反了面向对象的特性,即对象拥有独立的生命周期,有一种灵活的方法即指定一项操作所用的“接者者”,因此需要一个额外的参数来表示该接受者。这个参数通常称为self或this

function Account.withdraw(self,v)
    self.balance = self.balance - v
    print(self.balance);
end

下面调用该方法,必须指定期作用对象

a1 = Account;Account = nil
a1.withdraw(a1,100.00)  --100

self参数是所有面像对象语言的一个核心。大多数面向对象语言都能对程序员隐藏部分self参数。lua只需要用冒号则能隐藏该参数,即可重写为

Account = {balance = 0}
function Account:withdraw(v)
    self.balance = self.balance - v
    print(self.balance);
end

a1 = Account;Account = nil
a1:withdraw(100.00)  --100

16.1 类

lua实现原型是依赖于元表。如果两个对象a,b,要让b做为a的一个原型只需要输入以下语句:

setmetatable(a,{__index=b})

加到先前银行账号示例。为了创建更多与Accoun行为类似的账号(这里的类似指具有相同方法),可以让这些新对象从Account中继承这些操作。具体做法就是使用 __index元方法,可以应该一项小优化,则无须创建一个额外的table作为账号对象元表。而是使用Account table自身作为对象元表。

Account = {balance = 0,
    withdraw = function(self,v)
                    self.balance = self.balance - v
                    print(self.balance);
               end
            }

function Account:deposit(v)
    self.balance = self.balance + v
    print(self.balance);
end

function Account:new(o)
    o = o or {}  --如果用户没有提供table则创建一个
    setmetatable(o,self)
    self.__index = self
    return o
end

a = Account:new{balance = 0}
a:deposit(100.00) --输出100

如上代码所示实际上table a 只有一个成员balance = 0,那它为什么调用deposit方法确成功了呢,这就是__index元方法的功能所在了。__index元方法在table找不到成员时会去寻找__index元方法所在的table里找方法。而这样就是lua继承的概念。

当创建新账户时,a会将Account作为其元表。而当调用a:deposit(10

--基类 Account
Account = {balance = 0}
function Account::withdraw(self,v)
    self.balance = self.balance - v
    print(self.balance);
end

function Account:deposit(v)
    self.balance = self.balance + v
    print(self.balance);
end

function Account:new(o)
    o = o or {}  --如果用户没有提供table则创建一个
    setmetatable(o,self)
    self.__index = self
    return o
end



--子类 SpecialAccount继承自 Account
SpecialAccount = Account:new()

s = SpecialAccount:new{limit=1000.00}  --s继承自SpecialAccount
s:deposit(100.00)  --最终会在Account里找见deposit的实现


--SpecialAccount之所有特殊是因为可以重定义那些从基类继承来的方法,编写一个方法的新实现只需要
function SpecialAccount:withdraw(v)
    if v - self.balance >= self:getLimit() then
        error"insufficient funds"
    end
    self.balance = self.balance - v
end

function SpecialAccount:getLimit()
    return self.limit or 0
end


--s表示一个特殊客户 这个客户透支额度总是其余额的10%,那么可以只修改这个对象
function s:getLimit()
    return self.balance * 0.10
end
0.00)时,就调用了a.deposit(a,100.00),lua无法从table a中找到条目deposit,那么它会进一步寻找__元表__index的值。最终调用为
getmetatable(a).__index.deposit(a.100.00)

a的元表是Account,Account.__index 也是Account上面这个可以化简为:

Account.desposit(a,100.00)

继承不仅可以用作方面,也可以用作没有的字段 ,如下所示

b = Account.new()
print(b.balance) --0

16.2继承

相关文章
|
安全 Java Maven
PO VO DTO 转换神器替代BeanUtils 了(一)
PO VO DTO 转换神器替代BeanUtils 了
383 0
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
278 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
389 38
Meta SAM3开源:让图像分割,听懂你的话
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
668 219
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
129 95
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1627 157