注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Lua战记5——类和对象之二类进阶  

2012-01-27 00:04:55|  分类: Lua学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

Lua战记5——类和对象之二类进阶

这里说一下LuaEdit使用的版本是5.0,在上面的一些例程可能会无法执行,升级到最新的 5.2就可以了,昨天也是在这里折腾了好一会子,真晕,学习一些新东西总是在这些个小事上折腾很久,特别是这些个小众的语言,查资料也比较难找。

接着我们的类来说,有类就要有继承,上面讲过了一些简单的用法,下面讲一下比较复杂的用法,先看一个例子:(代码出自LUA中文教程)

-- create class
Account = {balance = 0}
 
 
-- constructor
function Account:new (o)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  return o
end
 
-- method `deposit'
function Account:deposit (v)
  self.balance = self.balance + v
end
 
-- method `withdraw'
function Account:withdraw (v)
  if v > self.balance then error"insuficient funds" end
  self.balance = self.balance - v
end

 

我们来看,要想从这个类中派生出一个子类来SpecialAccount该怎么办呢?看下面:

SpecialAccount = Account:new()

你会说,这不是一个生成一个Account的别名或者引用更或者说一个实例嘛,对,你说的没有错。再看:

s=SpecialAccount:new{limit=1000.00}---注意后面的是大括号,具名实参,等于是定义了--------一个类的实例,然后再当成其参数传递给函数。

S继承自SpecialAccount,而其又继承自Account,而创建S时,self指向的是SpecialAccount,S的原表是SpecialAccount,而SpecialAccount又继承自Account,所以当执行s:deposit(1000.00)时,Lua会在s查找deposit,查找不到后再在SpecialAccount中查找,直到在Account中查找到,这是语法糖的一种用法,在前面的类中其实已经涉及到了,不过没有细讲。其实不过是table的不断的反复的查找的过程。

下面再看类似于父子类之间的隐藏的效果,这个和C++看上去没啥大的区别啊

function SpecialAccount:withdraw(v)

       print(“this is test”)

       self.GetLimit()

end

function SpecialAccount:GetLimit()

print(“  ”)

end

 

那么如果你调用s:withdraw(2)这个函数,就不再会去Account里去查找了,因为在劫难逃SpecialAccount里,发现了这个函数,这不就是父子类之间的隐藏么。

另外,在处理单个对象时如果他有一个独特的不同于其它对象的方法,那么你可以只修改其一个的方法,不会影响到其它,这个非常方便,其实觉得还是跟LUA生成的类实例可以单独保存生命周期有一定的关系。

function s:GetLimit()

print(“  ”)

end

如果你执行s: withdraw ()那么,程序仍然会调用SpecialAccount里的withdraw,不过最终执行self.GetLimit()这个函数却是调用的上面这个函数了,这又类似于虚拟函数了,真是有点儿晕啊。

多重继承这里不说,在C++里基本都不提倡使用多重继承,这个暂时先不讲,用到再说。一如在C和C++中,强调多使用局部变量,少用全局,在LUA中亦如此,多用local,少用global.

你不努力也得努力,努力也得努力,没办法了,被他们打败了,还是努力吧。

  评论这张
 
阅读(1289)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017