lua面向对象编程 《lua程序设计》 16章 笔记
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继承
最新文章
- Ext 三级联动 及附值
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q9-Q12)
- python常用数据类型内置方法介绍
- jsp页面变量作用域问题
- DllImport的具体用法
- 关于 终端 ls 命令 不能区分文件和目录的问题
- MVC form post 传值
- IIS 之 在IIS7、IIS7.5中应用程序池最优配置方案
- 基于Spring Cloud、JWT 的微服务权限系统设计
- Grafana简单使用
- linux中的&;&;,|| 与 () 命令
- k8s namespace/volume
- nginx.conf 集群完整配置
- 57 ORM多表查询
- openal支持的通道数和声道数
- dispatchEvent相关内容
- 学习Spring Boot:(十七)Spring Boot 中使用 Redis
- mysql--SQL编程(关于mysql中的日期,实例,判断生日是否为闰年) 学习笔记2.1
- lua -- handler
- Crawlspider的自动爬取
热门文章
- (15)python 数据库连接
- Linux命令之groupadd
- 【计算几何】【斜率】bzoj1610 [Usaco2008 Feb]Line连线游戏
- 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树
- 【知识点总结】NOIP前夕 2014.11.4
- 自定义数据类型写入SequenceFile并读出
- tcp状态-TIME_WAIT与CLOSE_WAIT带来的坑
- JNI概述
- ASP.NET Core 1.0基础之日志
- Linux查找并删除重复文件的命令行fdupes工具,dupeGuru图形工具