Account={balance=}
function Account.withdraw(self,v)
self.balance=self.balance-v
end a={balance=,withdraw=Account.withdraw}
a.withdraw(a,) --面向对象语言常使用self参数,lua提供了通过使用冒号操作符来隐藏self参数的声明 function Account:withdraw(v)
self.balance=self.balance-v
end
a:withdraw(100.0)
--冒号的效果相当于在函数定义和函数调用的时候,增加一个额外的隐藏参数
--我们可以使用dot语法定义函数而用冒号语法调用函数,反之亦然,只要我们正确的处理好额外的参数.
--dot语法定义时要加上self参数,调用时要传入相应的对象,冒号语法不用self参数,调用时也不需要相应的参数对象

Lua中对象没有类,每个对象有一个原型prototype,当调用不属于对象的某些操作时,会最先会到prototype中查找这些操作。

Account={balance=}

function Account:withdraw(v)
self.balance=self.balance-v
end function Account:deposit(v)
self.balance=self.balance+v
end function Account:new(o)--返回一个子对象
o=o or {}
setmetatable(o,self)--Account成为o的原型
self.__index=self
return o
end a=Account:new{balance=}
print(a.balance)--输出0
a:deposit(100.00)
print(a.balance)--输出100

Account={balance=}

function Account:withdraw(v)
if v>self.balance then error"insufficient funds" end
self.balance=self.balance-v
end function Account:deposit(v)
self.balance=self.balance+v
end function Account:new(o)
o=o or {}
setmetatable(o,self)--Account成为o的原型
self.__index=self
return o
end SpecialAccount=Account:new() function SpecialAccount:getLimit()
return self.limit or
end
--子类可以重定义从父类中继承来的方法
function SpecialAccount:withdraw(v)
if v-self.balance>=self:getLimit() then
error"insufficeint funds"
end
self.balance=self.balance-v
end s=SpecialAccount:new{limit=1000.00} function s:getLimit()
return self.balance*0.1
end s:withdraw(200.0)--该调用将运行SpecialAccount的withdraw方法,但是当
--方法调用self:getLimit时,最后的定义被触发.

多重继承:将函数用作__index。当一个表的metatable存在一个__index函数时,如果lua调用一个原始表中不存在的函数,Lua将调用这个__index指定的函数,这样可以用__index实现在多个父类中查找子类不存在的域。

--原型,相当于父类
Account={money=} function Account:save(v)
self.money=self.money+v
end function Account:spend(v)
self.money=self.money-v
if self.money< then
error"there is not enough money"
end
end function Account:new(o)
o=o or {}
setmetatable(o,self)
self.__index=self--首先在o的原型中查找,然后在原型的__index中查找
return o
end
--k是缺少的域,plist是table,其元素也是table
function search(k,plist)
for i=,table.getn(plist) do
local v=plist[i][k]
if v then return v end
end
end function createClass(...)
local c={}
--__index是函数时,Lua将table和其缺少的域作为参数调用这个函数
setmetatable(c,{__index=function(t,k) print(t,k) return search(k,arg) end})
c.__index=c
function c:new(o)
o=o or {}
setmetatable(o,c)
return o
end
return c
end Named={} function Named:getname()
return self.name
end function Named:setname(s)
self.name=s
end NamedAccount=createClass(Account,Named)
account=NamedAccount:new{name="paul"}
print(NamedAccount)
print(account:getname()) --[[
table: 0039C988
table: 0039C988 getname
paul
]]

私有性

function newAccount(initialBalance)
--存储在self表中的部分都是私有的
local self={balance=initialBalance} local withdraw=function(v)
self.balance=self.balance-v
end local deposit=function(v)
self.balance=self.balance+v
end local getBalance=function() return self.balance end return {
withdraw=withdraw,
deposit=deposit,
getBalance=getBalance
}
end instance=newAccount()
print(instance.getBalance())
instance.withdraw()
print(instance.getBalance())

single-method的对象实现方法:当对象只有一个单一的方法时,可以将这个单一的方法作为对象返回

function newObject(value)
return function(action,v)
if action=="get" then return value
elseif action=="set" then value=v
else error("invalid action")
end
end
end
--每一个对象是一个单独的闭包,代价比表小得多,这种方式没有继承但有私有性:访问
--对象状态的唯一状态是通过它的内部方法
d=newObject()--d这个对象是newObject返回的单一方法
print(d("get"))--
d("set",)
print(d("get"))--

Lua的面向对象程序设计的更多相关文章

  1. [.net 面向对象程序设计深入](0) 开篇

    [.net 面向对象程序设计深入](0)开篇        [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...

  2. [.net 面向对象程序设计进阶] (1) 开篇

    [.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...

  3. [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作

    [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...

  4. [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux)

    [.net 面向对象程序设计深入](5)MVC 6 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux) 1.关于跨平台 上篇中介绍了MVC的发展历程,说到ASP.NET ...

  5. [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向

    [.net 面向对象程序设计深入](4)MVC 6 ——谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...

  6. [.net 面向对象程序设计深入](3)UML——在Visual Studio 2013/2015中设计UML活动图

    [.net 面向对象程序设计深入](3)UML——在Visual Studio 2013/2015中设计UML活动图 1.活动图简介 定义:是阐明了业务用例实现的工作流程. 业务工作流程说明了业务为向 ...

  7. [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图

    [.net 面向对象程序设计深入](2)UML——在Visual Studio 2013/2015中设计UML用例图  1.用例图简介 定义:用例图主要用来描述“用户.需求.系统功能单元”之间的关系. ...

  8. [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图

    [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...

  9. [.net 面向对象程序设计进阶] (28) 结束语——告别2015

    [.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...

随机推荐

  1. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  2. [算法天天练] - C语言实现双向链表(一)

    双向链表是比较常见的,主要是在链表的基础上添加prev指针,闲话少说直接上代码吧(这个也是网上一个大神的思路,真心不错,条理清楚,逻辑缜密) 主要也是为了学习,贴上我所调试成功的代码(Linux环境下 ...

  3. Angular——作用域

    基本介绍 应用App是无法嵌套的,但是controller是可以嵌套的,每个controller都会对应一个模型(model)也就是$scope对象,不同层级的controller下的$scope遍产 ...

  4. 关于 . H 宏定义技巧

    #ifndef   LABEL #define   LABEL //代码部分 #endif LABEL为一个唯一的标号,命名规则跟变量的命名规则一样.常根据它所在的头文件名来命名,例如,如果头文件的文 ...

  5. 语义分割:使用关系图辅助图像分割-Capsule Network、IceNet

    文章:欲取代CNN的Capsule Network究竟是什么来头?它能为AI界带来革命性转折么? 文章:用于分类.检测和分割的移动网络 MobileNetV2 网络 文章:后RCNN时代的物体检测及分 ...

  6. 字符编码方式ASCII、Unicode、UTF-8

    一.ASCII 1.介绍 即American Standard Code for Information Interchange(美国信息交换标准代码),是基于拉丁字母的,主要用于显示现代英语和其他西 ...

  7. (转)Hibernate框架基础——映射集合属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52745486 集合映射 集合属性大致有两种: 单纯的集合属性,如像List.Set或数组等集合 ...

  8. 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理

    (1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...

  9. 01C++编辑编译运行环境

    C++编辑编译运行环境 Bloodshed Dev-C++ Microsoft Visual Studio

  10. JAVA基础——异常--解析

      简介 异常处理是java语言的重要特性之一,<Three Rules for effective Exception Handling>一文中是这么解释的:它主要帮助我们在debug的 ...